题目描述
已知 n 个整数 x_1,x_2,...,x_n,以及 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)。
第二行 n 个整数,分别为 x_1,x_2,...,x_n(1 <= x_i <= 5x 10^6)。
输出格式
输出一个整数,表示种类数。
样例 #1
样例输入 #1
4 3
3 7 12 19
样例输出 #1
1
这道题可以用递归来做,先看代码。
#include<iostream>
using namespace std;
int n, k; // 输入的整数个数和选择的整数个数
int a[25]; // 存储输入的整数
long long ans; // 记录满足条件的和为素数的组合数量
bool isprime(int x) {
if (x == 0 || x == 1)
return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0)
return false;
}
return true;
}
// 深度优先搜索函数
// m:当前已选择的整数个数
// sum:当前已选择整数的和
// startx:下一个可以选择的整数下标
void dfs(int m, int sum, int startx) {
if (m == k) { // 如果已选择的整数个数达到了k
if (isprime(sum)) { // 判断和是否为素数
ans++; // 满足条件的组合数量加一
return;
}
}
for (int i = startx; i < n; i++) {
dfs(m + 1, sum + a[i], i + 1); // 递归选择下一个整数
}
return;
}
int main() {
cin >> n >> k; // 输入整数个数和选择的整数个数
for (int i = 0; i < n; i++)
cin >> a[i]; // 输入n个整数
dfs(0, 0, 0); // 调用深度优先搜索函数
cout << ans; // 输出满足条件的组合数量
return 0;
}
这段代码使用了深度优先搜索(DFS)来穷举所有可能的组合。对于每一个选择的组合,它会计算组合的和,并判断和是否为素数。如果满足条件,就将答案数量加一。