题目:来源于洛谷
输入样例:
4 3
3 7 12 19
输出样例:
1
分析:
计算k个数的和,要想使得它们之和不重复,那么就按数组下标升序 来求和
上代码:
参考东北小蟹蟹的博客
#include <iostream>
#include <cstdio>
using namespace std;
bool isPrime(int n) {
if (n < 1) {
return false;
}
for (int i = 2; i*i <= n; ++i) {
if (n%i == 0) {
return false;
}
}
return true;
}
int n, k;
int arr[25];
long long ans;
// choose_num 代表现在选择了多少个数
// sum代表当前的和
// start_index代表最开始的下标
void dfs(int choose_num, int sum, int start_index) {
//当choose_num==k,表示选完了
if (choose_num == k) {
if (isPrime(sum)) {
ans++;
}
return;
}
for (int i = start_index; i < n; ++i) {
dfs(choose_num + 1, sum + arr[i], i + 1);
}
return;
}
int main()
{
scanf("%d%d", &n, &k);
for (int i = 0; i < n; ++i) {
scanf("%d", &arr[i]);
}
dfs(0, 0, 0);
printf("%d", ans);
return 0;
}
这道题想了好久都不会!
(ง •_•)ง