P1036 [NOIP2002 普及组] 选数
题目:
思路:使用dfs选数模型
dfs递归遍历序列,有两种状态,一种是选,一种是不选,根据题目可知,选与不选总个数不能大于n,选的个数不能大于k,如果选的个数等于k,并且是累加和为素数,记录个数。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[100005];
int ans=0;
int shusu(int s){ //素数函数
if(s<=3) s>=2;
for(int i=2;i<=sqrt(s);i++){
if(s%i==0) return 0;
}
return 1;
}
void dfs(int s,int i,int j){
if(j>n) return;//边界条件
if(i>m) return;//边界条件
if(i==m){
if(shusu(s))//判断素数
ans++;
return ;
}
dfs(s,i,j+1);//不选这个数
dfs(s+a[j],i+1,j+1);//选这个数
return;
}
int main()
{
cin >> n>>m;
for(int i=0;i<n;i++)
cin >> a[i];
dfs(0,0,0);
cout << ans;
return 0;
}
版权声明:本文为kuangzeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。