洛谷P1036 [NOIP2002 普及组] 选数 (搜索)
n个数中选取k个数,判断这k个数的和是否为质数。
在dfs函数中的状态有:选了几个数,选的数的和,上一个选的数的位置;
试除法判断素数即可;
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e6+5; 4 int n,k,a[N],ans; 5 6 bool isprime(int x){ 7 int vi=sqrt(x); 8 for(int i=2;i<=vi;i++){ 9 if(x%i==0) return false; 10 } 11 return true; 12 } 13 14 void dfs(int cnt,int sum,int last){ 15 if(cnt==k){ 16 if(isprime(sum)) ans++; 17 return ; 18 } 19 for(int i=last;i<=n;i++) 20 dfs(cnt+1,sum+a[i],i+1); 21 return ; 22 } 23 24 int main(){ 25 scanf("%d%d",&n,&k); 26 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 27 dfs(0,0,1); 28 cout<<ans; 29 }