问题 C: 【递归入门】组合+判断素数
时间限制: 1 Sec 内存限制: 128 MB
提交: 305 解决: 108
[提交][状态][讨论版][命题人:外部导入]
题目描述
已知 n 个整数b1,b2,…,bn
以及一个整数 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个整数:x1,x2,…,xn (1<=xi<=5000000)
输出
一个整数(满足条件的方案数)。
样例输入
4 3 3 7 12 19
样例输出
1
#include<iostream>
#include<cmath>
using namespace std;
int n, k, num, a[20];
bool isPrime(long long sum) {
for (int i = 2; i <= sqrt(sum); i++) {
if (sum%i == 0) return false;
}
return true;
}
void DFS(int index, int x, long long sum) {
//index抵达数组a的下标,x已选数字个数
if (x == k) {
if (isPrime(sum)) num++;
return;
}
if (index == n) return;
DFS(index + 1, x + 1, sum + a[index]);//若选a[index]
DFS(index + 1, x, sum);//若不选a[index]
}
int main() {
while (cin >> n >> k) {
num = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
DFS(0, 0, 0);
cout << num << endl;
}
return 0;
}