问题描述
已知 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 第二行为空格分开的n个数,分别表示x1,x2,...,xn
输出格式
一个整数,表示满足条件的种数
样例输入
4 3 3 7 12 19
样例输出
1
#include<iostream>
#include<math.h>
using namespace std;
int x[20], n, k;
bool isshusu(int num)
{
int s = sqrt(double(num));
for (int i = 2; i <= s; i++)
{
if (num % i == 0)
return false;
}
return true;
}
//choose_left_num为剩余的k,already_sum为前面累加的和,start和end
//为全组合剩下数字的选取范围;调用递归生成全组合,在过程中逐渐把K个数相
//加,当选取的数个数为0时,直接返回前面的累加和是否为质数即可
int rule(int choose_left_num, int already_sum, int start, int end)
{
if (choose_left_num == 0)
return isshusu(already_sum);
int sum = 0;
for (int i = start; i <= end; i++)
{
sum += rule(choose_left_num - 1, already_sum + x[i], i + 1, end);
}
return sum;
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> x[i];
}
cout << rule(k, 0, 0, n - 1); //递归解决问题
}
|