深搜--P1036选数

深搜中绝对会用到递归

因此本题也可以使用深搜来做

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

爱氏筛法

 

posted @ 2020-02-03 21:44  ·Iris  阅读(196)  评论(0编辑  收藏  举报