[2002年NOIP普及组] 选数

[2002年NOIP普及组] 选数

思路:从第一个数a[1]开始深搜,数字u个数+1,可以选择让它参与序列或不。

若它参与,则数字和sum+a[u],要与k比较的nums+1(表示序列的个数);反之,不改变;

最后使各个数字分别排列组合成新的序列.新的序列必须满足和为素数才算数,最后输出满足条件的序列。

代码如下:

#include<iostream>

#include<cmath>

using namespace std;

int n,k,cnt=0;

int a[25];

bool pd(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_search(int u,int sum,int nums)

{

     if(nums==k)

       if(pd(sum))

           {

            cnt++;

            return;

         }

     if(u>n||nums>k) return ;

  dfs_search(u+1,sum+a[u],nums+1);//选这个数

     dfs_search(u+1,sum,nums);//不选这个数

    

}

int main()

{

     cin>>n>>k;

     for(int i=1;i<=n;i++)

        cin>>a[i];

     dfs_search(1,0,0);//1个数总和为0 现在有0个数 

     cout<<cnt<<endl;

     return 0;

 }

posted @ 2022-08-23 17:07  shanyingrui  阅读(238)  评论(0编辑  收藏  举报