P1036 选数

P1036 选数

 题解

1.这道题是用递归做(貌似是DFS搜索与回溯,好像没有本质区别)

    dg ( last , now )  已经选了last个数,现在要选第now个数

   为了保证不重复,要选第now个数那就从编号now~n当中选数喽

2.判断结果是不是素数

   不能用线性筛,范围太大太浪费(我用xxs WA了)

   要用试除法,1~√n

 

 

 代码

#include<bits/stdc++.h>

using namespace std;

int k,n,ans=0;
int a[21],v[21];
int sum=0;

int scf(int shu)  //要用试除法,不能用线性筛 
{
    for(int i=2;i<=sqrt(shu);i++)
      if(shu%i==0) return 0;
    return 1;
}

void dg(int last,int now)   //已经选了last个数字,现在要选第now个数 
{
    for(int i=now;i<=n;i++)
    {
        v[i]=1;
        sum+=a[i];
        if(last+1==k)   //找全一组数据
        {
            if(scf(sum))  
              ans++;
        }
           
        else             //没找够,继续找
           dg(last+1,i+1);
               
        sum-=a[i];     //回溯
        v[i]=0;
    }
    
}

int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    
    dg(0,1);    
    
    printf("%d",ans);
}

 

posted @ 2019-06-11 17:03  晔子  阅读(318)  评论(0编辑  收藏  举报