也许遗憾才是人生常态
题目链接:P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
解题思路:
在n个数里取m个数,每个数大于前一项,意思就是只能在当前的数的后面取数,dfs搜索题,函数里存两个参数,依次是当前取数的位置和要开始取的数,依次加加往下取,直到大于,就把取到数当作数组索引,依次把数加起来,再判断每回合取的数的和是否为质数
下面是c++代码:
#include<iostream>
using namespace std;
int n, r, number = 0;
int arr[100010];
int st[100010];
bool isprime(int num) {
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
void dfs(int sum,int x) {
if (sum > r) {
int num = 0;
for (int i = 1; i <= r; i++) {
num += st[arr[i]];
}
if (isprime(num)) {
number++;
}
return;
}
for (int i = x; i <= n; i++) {
arr[sum] = i;
dfs(sum + 1,i + 1);
arr[sum] = 0;
}
}
int main()
{
cin >> n >> r;
for (int i = 1; i <= n; i++) {
cin >> st[i];
}
dfs(1,1);
cout << number;
return 0;
}