洛谷 P1036.选数

洛谷 P1036.选数

题目描述

已知 n 个整数 x1,x2,…,x​,以及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<bits/stdc++.h>
using namespace std;
const int N = 30;
int a[N], n, k;

bool zs(int num)    //求质数
{
	int n = sqrt(num);
	for (int i = 2; i <= n; i++)
	{
		if (!(num % i))
			return false;
	}
	return true;
}
//idx角标 sum和 num还需要多少个数
int fun(int idx, int sum, int num)
{
	int res = 0;
	sum += a[idx];
	num--;
	if (num)
	{
		int max = n-num+1;
		for (int i = idx + 1; i < max; i++)
		{
			res += fun(i, sum, num);
		}
	}
	else
	{
		if (zs(sum))
			return 1;
	}
	return res;
}

int main()
{
	scanf("%d%d", &n, &k);
	for (int i = 0; i < n; i++)scanf("%d", &a[i]);
	int res = 0;
	for (int i = 0; i <= n - k; i++)
		res += fun(i, 0, k);
	printf("%d", res);
	return 0;
}
原文地址:https://www.cnblogs.com/fsh001/p/12320997.html