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