P1036 选数
`#include
include //用于 sqrt 函数
using namespace std;
int n, k;
int a[25]; // 题目说 n<=20,开稍大一点
int ans = 0;
// 判断素数的函数 (标准模板)
bool isPrime(int x) {
if (x < 2) return false;
// 只需要循环到 sqrt(x) 即可,提高效率
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
// DFS 函数
// start: 当前只能从数组的第几个位置开始选(防止走回头路),这个是控制搜索顺序的关键
// count: 当前已经选了几个数,作为一个
// sum: 当前已选数字的总和
void dfs(int start, int count, int sum) {
// 1. 截止条件:选够了 k 个数
if (count == k) {
if (isPrime(sum)) {
ans++;
}
return; //回溯
}
// 2. 遍历选择
// i和start共同控制了遍历选择的方式,只能向后选
for (int i = start; i <= n; i++) {
// 递归进入下一层:
// 下一次搜索从 i+1 开始
// 已选个数 count+1
// 当前和 sum + a[i]
dfs(i + 1, count + 1, sum + a[i]);
}
}
int main() {
// 1. 输入数据
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
// 2. 开始搜索
dfs(1, 0, 0);
// 3. 输出
cout << ans << endl;
return 0;
}`

浙公网安备 33010602011771号