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