luogu P1036 选数 x

 

P1036 选数

题目描述

已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34。

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29)。

输入输出格式

输入格式:

 

键盘输入,格式为:

n , k (1<=n<=20,k<n)

x1,x2,…,xn (1<=xi<=5000000)

 

输出格式:

 

屏幕输出,格式为:

一个整数(满足条件的种数)。

 

输入输出样例

输入样例#1:
4 3
3 7 12 19
输出样例#1:

  1

思路:

  首先先用dfs搜一下,然后如果选完数,就判断当前计算出的这个数是否为素数,如果是素数,ans++(说明找出了一种情况)

  最后输出ans即可

代码:

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int n,k,ans;
int a[22];

int pd(int x)
{
    if(x==2||x==3) return 1;
    if(x%2==0 || x==1) return 0;
    int j=3;
    while(j<=sqrt(x)&&x%j!=0) j+=2;
    if(x%j==0) return 0;
    else return 1;
}

void dfs(int pos,int l,int sum)
{
    if(!pos)///没有数能够继续被选择了 
    {
        int now=pd(sum);///当前所组成的和是否为素数 
        ans+=now;///如果是ans++ 
        return;
    }
    for(l;l<=n;l++)///从当前的数后面之中再选取一个 
        dfs(pos-1,l+1,sum+a[l]);///表示又选取一个数 
}

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

 

posted @ 2017-06-15 18:11  夜雨声不烦  阅读(229)  评论(0编辑  收藏  举报