深搜中绝对会用到递归
因此本题也可以使用深搜来做
bool prime(int b) { memset(sz, true, sizeof(sz)); sz[1]=false; for (int i=2;i<=b;i++) { if (sz[i]) { for (int j=2*i;j<=b;j+=i) sz[j]=false;
定义一个dfs函数来解决对数的搜索
step代表执行步数
sum代表已经选好的数据的和
cet代表已经选完的数的个数
接下来进行搜索
另外介绍下非朴素版的寻找质数的方法
被人称作爱氏筛法
但是呢,我在本题中并未使用
深搜程序:
#include<cstdio> #include<cmath> #include<cstdio> using namespace std; int a[10001]; int n,k,tot,sum; inline bool prime(int); inline void dfs(int,int ,int); inline void print() { printf("%d",tot); } int main() { scanf("%d%d",&n,&k); for(register int i=1;i<=n;i++) scanf("%d",&a[i]); dfs(1,0,0); print(); return 0; } bool prime(int l) { for(int i=2;i<=sqrt(l);i++) { if(l%i==0) return false; } return true; } void dfs(int step,int sum,int cet) { if(step==n+1||cet==k) { if(prime(sum)&&cet==k) tot++; return; } dfs(step+1,sum+a[step],cet+1); dfs(step+1,sum,cet); return; }
爱氏筛法