自用。
题目传送门:[NOIP2002 普及组] 选数 - 洛谷
题解:Inori_333
参考题解:题解 P1036 【选数】 - 洛谷专栏
题目描述
已知 n 个整数 x1,x2,⋯ ,xn以及 11 个整数 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)。
第二行 nn 个整数,分别为 x1,x2,⋯ ,xn()。
输出格式
输出一个整数,表示种类数。
输入输出样例
输入 #1
4 3
3 7 12 19
输出 #1
1
说明/提示
【题目来源】
NOIP 2002 普及组第二题
/*
P1036 [NOIP2002 普及组] 选数
https://www.luogu.com.cn/problem/P1036
2024/10/03 submit:Inori333
*/
#include<bits/stdc++.h>
using namespace std;
int n, k, ans;
int a[21];
bool isPrime(int x){
if(x==1)
return false;
for (int i = 2; i * i <= x; i++){
if(x%i==0)
return false;
}
return true;
}
void DFS(int m,int sum,int start){
//m表示当前序列选择了几个数
//sum表示当前的和
//start表示不降原则下的下一个可能的选择
if(m==k){//如果已经选够m个
if(isPrime(sum))
ans++;
return;
}
// 如果还没选够m个
// 例子;3 7 12 19
//i=0 DFS(1,0+3,1) 3
//i=1 DFS(2,3+7,2) 3,7
//i=2 DFS(3,3+7+12,3) 3,7,12 not prime->end
//i=2 DFS(3,3+7+19,3) 3,7,19 is prime->end
//i=1 DFS(2,3+12,2) 3,12
//i=2 DFS(3,3+12+19,3) 3,12,19 not prime->end
for (int i = start; 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];
}
DFS(0, 0, 0);
cout << ans;
return 0;
}