https://www.luogu.com.cn/problem/P1036
分析:采用dfs
结束条件:当选数个数大于k时,则判断本次的和sum是否为素数即可。
递归条件:如果本数没有被选到,则可以加上并递归。
1.一共选k个数
2.k个数的和
3.选数的位置
代码展示(第一次发题解代码)
#include<bits/stdc++.h>//万能头
using namespace std;
int a[10000000];
int sum=0;
int cnt;//计数器
int n,k;
bool check(int summ)//判断是否为素数
{
for(int i=2;i*i<=summ;i++)
{
if(summ%i==0)
{
return false;
}
}
return true;
}
void dfs(int d,int sum,int loc)//dfs
{
if(d==k)//如果深度为k,即不需要再往下找数了
{
if(check(sum))//判断素数条件是否成立
{
cnt++;
}
return ;
}
for(int i=loc;i<n;i++)//此时为深度<k所以需要继续往下找
{
dfs(d+1,sum+a[i],i+1);//sum为数组a[i]的和,loc是从0开始记起的
}
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
dfs(0,0,0);//深度,求和,位置
cout<<cnt<<endl;
return 0;
}