【递归入门】组合+判断素数
时间限制: 1 Sec 内存限制: 128 MB
提交: 205 解决: 77
[提交][状态][讨论版][命题人:外部导入]
题目描述
已知 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 a[100],p[100],m[100]={0};
int n,k,sum=0,count=0;
bool vis[100]={false};
int isprime(int sum){
int flag=0;
for(int i=2;i<=sqrt(sum);i++){
if(sum%i==0){
flag=1;
break;
}
}
return flag;
}
void dfs(int x,int z){ //z控制不重复
if(x==k+1){
// for(int i=1;i<=k;i++){
// cout<<p[i]<<" ";
// }
// cout<<endl;
sum=0;
for(int i=1;i<=k;i++){
sum+=p[i];
}
if(isprime(sum)==0){
count++;
}
}
for(int i=z;i<=n;i++){
p[x]=a[i];
dfs(x+1,i+1); //i+1保证必须 再后面取数!
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
//m[i]=i;
}
dfs(1,1);
cout<<count;
return 0;
}