题目描述

1
2
3
4
5
6
7
8
已知n个整数xn,和1个整数k(k<n)。从n个整数中选k个整数相加,得到一系列和。
现在,要求你计算出和为素数共有多少种。
输入格式:
第一行输出,n,k(1<=n<=20, k < n)
第二行输入n个整数

输出格式:
输出一个整数,表示种类数

题解

题解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//——————————————————————————————法一——————————————————————————————
#include <iostream>

using namespace std;

const int N = 30;

int a[N];

int n, k;
int ans;//记录素数个数

bool isPrime(int x){//判断是否为素数
bool isFlag = true;
for(int i = 2; i * i <= x; i++){
if(x % i == 0) isFlag = false;
}
return isFlag;
}

void dfs(int m, int sum, int sta){
if(m == k){
if(isPrime(sum)) ans ++;//当选了k个数的时候,判断和是否为素数
return;
}

for(int i = sta; i < n; i++){ //关键步骤,使用不降原则去重,每次递归将起始+1
dfs(m + 1, sum + a[i], i + 1);
}

}

int main(){
ios::sync_with_stdio(false);
cin.tie(0);

cin >> n >> k;

for(int i = 0; i < n; i++){
cin >> a[i];
}

dfs(0, 0, 0);

cout << ans << endl;

return 0;
}

//————————————————————————————————法二————————————————————————————
#include <iostream>

using namespace std;

const int N = 30;

int n, k;
int a[N];
int ans;
int sum;

bool isPrime(int x){
for(int i = 2; i < x; i++){
if(x % i == 0) return false;
}
return true;
}

void dfs(int m, int sta){
if(m == k){
if(isPrime(sum)) ans++;
return;
}

for(int i = sta; i < n; i++){
sum += a[i];
dfs(m + 1, i + 1);
sum -= a[i];
}
}

int main(){
cin >> n >> k;

for(int i = 0; i < n; i++){
cin >> a[i];
}

dfs(0, 0);

cout << ans << endl;

return 0;
}