選數(組合搜索)

在這裏插入圖片描述
思路:利用深搜選擇,線性篩判斷素數
注意:這裏的搜索不降原則

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章