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;

}`

posted @ 2026-01-05 00:37  gosaky  阅读(1)  评论(0)    收藏  举报