洛谷——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


搜索!

思路:
搞了半天没搞出样例,后来发现原来是判素数的地方出错了,ORZ。
在搜索的时候我们选择倒着搜索,先搜索第k个数,再搜第k-1个(你也可以正着搜,这么开心怎么来。。。)
再看看搜索的数是否为素数,就好了
我们在搜完k位时,一定不要忘了判素数!!!(反正,我判素数的代码错了。。。。)
代码:
#include
#include
#include
#include
#include
#include
#define N 110
using namespace std;
int n,k,a[N],ans;
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int pd(int x)
{
    if(x==1||x==0) return 0;
    if(x==2) return 1;
    for(int i=2;i*i<=x;i++)
     if(!(x%i)) return 0;
    return 1;
}
void dfs(int k,int x,int sum)
{
    if(!k)
    {
        ans+=pd(sum);
        return ;
    }
    for(x;x<=n;x++)
     dfs(k-1,x+1,sum+a[x]);
}
int main()
{
    n=read();k=read();
    for(int i=1;i<=n;i++) a[i]=read(); 
    dfs(k,1,0);
    printf("%d",ans);
    return 0;
}
 
     

 

 

转载于:https://www.cnblogs.com/z360/p/7217924.html

你可能感兴趣的:(洛谷——P1036 选数)