从n个数中随机选出k个数,并判断和是不是素数

洛谷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 }

递归表示全排列

非常优美的代码!

posted @ 2019-04-18 22:17  Fzzf1  阅读(780)  评论(0编辑  收藏  举报