洛谷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 }

 

posted @ 2022-04-29 16:56  YHXo  阅读(33)  评论(0编辑  收藏  举报