洛谷 P1036选数

题目描述

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

猜你喜欢

转载自blog.csdn.net/qq_42914224/article/details/82749767