[2002年NOIP普及组] 选数

[2002年NOIP普及组] 选数

  • 分析:根据题意,在所给的四个数中选择三个数相加,看看其中的和有几个是素数,用递归求出所有的可能性,在求的时候要写好递归终止的条件,然后单独写一个判断素数的函数,如果是素数满足要求的数就+1,输出有几个满足要求的数。
  • #include<iostream>
    #include<cmath> 
    using namespace std;
    int n,k,cnt=0;
    int a[25];
    bool check(int sum)//判断素数 
    {
        if(sum==0||sum==1) return 0;//0为假 
        if(sum==2) return 1;//1为真 
        for(int i=2;i<sqrt(sum);i++)
          if(sum%i==0)
           return 0;
        return 1;
    }
    void dfs(int x,int sum,int s)//第几个数 和 现在有几个数 
    {
        if(s==k)//当前是3个数 
        {
            if(check(sum))//是素数 
            {
                cnt++;
                return;
            }    
        }
        if(x>n||s>n) return;
        dfs(x+1,sum+a[x],s+1);//选这个数 
        dfs(x+1,sum,s);//不选这个数 
    }
    int main()
    {
        cin>>n>>k;
        for(int i=1;i<=n;i++)
           cin>>a[i];
        dfs(1,0,0);//第1个数 总和为0 现在有0个数  
        cout<<cnt<<endl;
        return 0;
     } 

     

posted @ 2022-08-23 16:58  4lovls  阅读(73)  评论(0)    收藏  举报