题解:P1036 [NOIP 2002 普及组] 选数

\(n \le 20\) 首先想到搜索,使用 dfs 搜出所有搭配的和,判断是否为素数即可,具体见注释。

代码复杂度约为 \(O(2^n\sqrt{2^n})\),实际完全跑不满:

#include<bits/stdc++.h>
using namespace std;
int n, k, a[25], use[25], ans;
bool prime(int x){// 基本的判断素数
	if(x < 2) return 0;
	for(int i = 2; i * i <= x; i ++){
		if(x % i == 0) return 0;
	}
	return 1;
}
void dfs(int dep, int sum){ // dep:搜了几个数,sum:当前总和
	if(dep == k + 1){
		ans += (int)(prime(sum));// 一个简写,因人而异
		return;
	}
	for(int i = use[dep - 1] + 1; i <= n; i ++){
		use[dep] = i;// use:上次选的是第几个,避免重复
		dfs(dep + 1, sum + a[i]);
	}
}
int main(){
	cin >> n >> k;
	for(int i = 1; i <= n; i ++){
		cin >> a[i];
	}
	dfs(1, 0);
	cout << ans;
	return 0;
}

posted on 2025-02-28 21:46  zhangzirui66  阅读(147)  评论(0)    收藏  举报

导航