题目描述
已知 n 个整数 x1,x2,…,xn以及1个整数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个整数(满足条件的种数)。
输入输出样例
输入样例#1:
4 3
3 7 12 19
输出样例#1:
1
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,k;
int ans = 0;
int a[23];
bool sushu(int x)
{
for(int i = 2;i <= sqrt(x);i++)
{
if(x % i == 0)return false;
}
return true;
}
void dfs(int x,int s,int y)
{
if(x == n + 1 || y == k)//要么已经选好了k个数,要么已经选到了最后一个数
{
if(sushu(s) && y == k)
{
ans++;
}
return;//这次情况已经选好了就返回去选下一次的
}
dfs(x + 1,s + a[x],y + 1);//继续搜索选这个数或者不选这个数
dfs(x + 1,s,y);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
dfs(1,0,0);
printf("%d",ans);
return 0;
}