洛谷p1036
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 int x[20],n,k;//依照题目所设 5 bool isprime(int n){//判断是否质数 6 int s=sqrt(double(n)); 7 for(int i=2;i<=s;i++){ 8 if(n%i==0)return false; 9 } 10 return true; 11 } 12 int rule(int choose_left_num,int already_sum,int start,int end){//choose_left_num为剩余的k,already_sum为前面累加的和,start和end为全组合剩下数字的选取范围;调用递归生成全组合,在过程中逐渐把K个数相加,当选取的数个数为0时,直接返回前面的累加和是否为质数即可 13 if(choose_left_num==0)return isprime(already_sum); 14 int sum=0; 15 for(int i=start;i<=end;i++){ 16 sum+=rule(choose_left_num-1,already_sum+x[i],i+1,end); 17 } 18 return sum; 19 } 20 int main(){ 21 cin>>n>>k; 22 for(int i =0;i<n;i++)cin>>x[i]; 23 cout<<rule(k,0,0,n-1);//调用递归解决问题 24 }
递归表示全排列
非常优美的代码!