选数(组合搜索)

在这里插入图片描述
思路:利用深搜选择,线性筛判断素数
注意:这里的搜索不降原则

#include<cstdio>
#include<algorithm>
using namespace std;
int prime[5000005];
bool check[5000005];
int a[25];//储存输入的数 
int n,k,ans;
void is_prime(int n){//线性筛法 
	int cnt=0;
	check[1]=true;
	for(int i=2;i<=n;i++){
		if(!check[i])prime[cnt++]=i;
		for(int j=0;j<cnt&&i*prime[j]<=n;j++){
			check[i*prime[j]]=true;
			if(i%prime[j]==0)break;
		}
	}
} 
bool che(int n){

	if(!check[n]){
		return true;
	}
	return false;
}
//排列的不降原则搜索
void dfs(int sum,int step,int startx){//sum表示和,step表示选择了多少数,startx表示升序排列,以免算重复 
	if(step==k){
		if(che(sum)){//判断素数 
			ans++;
		}
		return;
	}
	for(int i=startx;i<n;i++){
		dfs(sum+a[i],step+1,i+1);
	}
	//return ;//这一步骤下,所有的都枚举完了; 
}
int main(){
	scanf("%d %d",&n,&k);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	is_prime(5000005);//预处理打表 
	dfs(0,0,0);
	printf("%d\n",ans);
	return 0;
}
发布了160 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Anterior_condyle/article/details/105394677