题目
总结
给定n个数字里面选择k个数字进行操作,使用递归操作。也类似于深搜。
代码
#include <bits/stdc++.h>
using namespace std;
int ans=0, n, k, a[25];
bool prime(int x) {//判断素数的
int i;
for (i = 2; i <= floor(sqrt(x)); i++) {
if (x%i == 0) {
return false;
}
}
return true;
}
void rec(int start, int count, int sum)//start是指从哪一位开始,count是现在已经有多少位了,sum是这count位的总和
{
if (count == k && prime(sum)) {//dfs终止条件,已经使用了k位
ans++;
return;
}
for (int i = start; i < n; i++) {//进行扩展,
//第一位选完了,接下来选第二个数。
//第一位数:i从0到n-1,共有n种选择,调用了自身n次
//第二位数:i从1到n-1,共有n-1种选择
rec(i + 1, count + 1, sum + a[i]);
}
}
int main() {
int i;
cin >> n >> k;
for (i = 0; i < n; i++) {
cin >> a[i];
}
rec(0, 0, 0);//a从0开始,所以起始位置从0开始
cout << ans << endl;
return 0;
}