题目描述
已知 nnn 个整数 x1,x2,…,xnx_1,x_2,…,x_nx1,x2,…,xn ,以及 111 个整数 kkk ( k<nk<nk<n )。从 nnn 个整数中任选 kkk 个整数相加,可分别得到一系列的和。例如当 n=4,k=3n=4,k=3n=4,k=3 , 444 个整数分别为 3,7,12,193,7,12,193,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=223+7+12=223+7+12=22
3+7+19=293+7+19=293+7+19=29
7+12+19=387+12+19=387+12+19=38
3+12+19=343+12+19=343+12+19=34 。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数: 3+7+19=293+7+19=293+7+19=29 。
输入输出格式
输入格式:键盘输入,格式为:
n,kn,kn,k ( 1≤n≤20,k<n1 le n le 20,k<n1≤n≤20,k<n )
x1,x2,…,xn(1≤xi≤5000000)x_1,x_2,…,x_n (1 le x_i le 5000000)x1,x2,…,xn(1≤xi≤5000000)
输出格式:屏幕输出,格式为: 111 个整数(满足条件的种数)。
输入输出样例
对于函数我以前一般是能不传参就不传参,设置一个全局变量,而这个一个题把我卡住了,这个题如果仅仅设置全局变量的话,处理的话很麻烦。
附上某大神的代码
#include<iostream>
#include<math.h>
using namespace std;
int x[20],n,k;//依照题目所设
bool isprime(int n){//判断是否质数
int s=sqrt(double(n));
for(int i=2;i<=s;i++){
if(n%i==0)return false;
}
return true;
}
int rule(int choose_left_num,int already_sum,int start,int end){//choose_left_num为剩余的k,already_sum为前面累加的和,start和end为全组合剩下数字的选取范围;调用递归生成全组合,在过程中逐渐把K个数相加,当选取的数个数为0时,直接返回前面的累加和是否为质数即可
if(choose_left_num==0)return isprime(already_sum);
int sum=0;
for(int i=start;i<=end;i++){
sum+=rule(choose_left_num-1,already_sum+x[i],i+1,end);
}
return sum;
}
int main(){
cin>>n>>k;
for(int i =0;i<n;i++)cin>>x[i];
cout<<rule(k,0,0,n-1);//调用递归解决问题
}