【编程题】
题目描述:已知 n 个整数 x1,x2,⋯,xn,以及 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 个整数,分别为x1,x2,⋯,xn(1≤xi≤5×10^6)。
输出格式
输出一个整数,表示种类数。
输入输出样例
输入
4 3
3 7 12 19
输出
1
//【参考答案】
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans[25];//保存当前的方案
int num[25];
int cnt;
bool isPrime(int x){
for(int i=2;i*i<=x;i++){
if( x%i == 0)
return 0;
}
return 1;
}
void dfs(int x){//X表示当前搜索到那个数
if(x>m){//如果m位都搜索完了,就输出方案并返回
int sum = 0;
for(int i=1;i<=m;i++)
sum+=num[ans[i]];//输出方案
if( isPrime(sum)){
cnt++;
}
return;
}
for(int i=ans[x-1]+1;i<=n;i++){//从小到大枚举
ans[x]=i;//保存到方案中
dfs(x+1);//进行下一步搜索
}
}
int main(){
scanf("%d%d",&n,&m);//输入
for(int i=1;i<=n;i++)
cin>>num[i];
dfs(1);//从第一个数开始搜索;
cout<<cnt<<endl;
}