题目描述
已知 n个整数 x1,x2,…,xn,以及1个整数k(k
3+7+12=22
3+7+19=29
7+12+19=38
3+12+19=34
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29。
输入格式
键盘输入,格式为:
n,k(1≤n≤20,k
x1,x2,…,xn(1≤xi≤5000000)
输出格式
屏幕输出,格式为: 1个整数(满足条件的种数)。
输入输出样例
输入 #1复制
4 3
3 7 12 19
输出 #1复制
1
#include
int n, k, a[25], cnt; //cnt记录素数个数,n、k、数组a设为全局变量,以便dfs函数调用
int prime(int p) { //判断是否是素数(详细注释见https://blog.csdn.net/qq_45472866/article/details/104045393)
if (p < 2)
return 0;
for (int i = 2; i * i <= p; i++)
if (p % i == 0)
return 0;
return 1;
}
void dfs(int step, int sum, int left) { //dfs搜索k个数,left为已选数的最左下标
int i;
if (step == k) { //step为已选的数的个数,等于k时停止搜索
if (prime(sum))
cnt++;
return;
}
for (i = left; i < n; i++) //从left开始往后找,,防止漏选重选
dfs(step + 1, sum + a[i], i + 1);
return;
}
int main() {
int i;
scanf("%d%d", &n, &k);
for (i = 0; i < n; i++)
scanf("%d", &a[i]); //循环读入数组元素
dfs(0, 0, 0); //从0开始搜索
printf("%d", cnt);
return 0;
}