[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;
}