码迷,mamicode.com
首页 > 其他好文 > 详细

P1036 选数

时间:2020-01-27 19:21:39      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:ready   生成   std   判断   isp   质数   include   main   范围   

#include<stdio.h>
#include<math.h>
int x[20],n,k,i;

 

//判断是否质数

int isprime(int n){
    for(i=2;i<=sqrt(n);i++){
        if(n%i==0)return 0;
    }
    return 1;
}

 

*******************************************************************

//重点

//choose_left_num为剩余的k,already_sum为前面累加的和,start和end为全组合剩下数字的选取范围;调用递归生成全组合,在过程中逐渐把K个数相加,当选取的数个数为0时,直接返回前面的累加和是否为质数即可

//每次选数的时候,我要知道选数范围、累加之和以及剩余次数

int rule(int choose_left_num,int already_sum,int start,int end){    //自己做时就没有考虑递归传入选区范围
    if(choose_left_num==0)return isprime(already_sum);
    int sum=0;          //有几个素数
    for(i=start;i<=end;i++){           //没有加够k个数时,就会因i>end而结束循环
        sum+=rule(choose_left_num-1,already_sum+x[i],i+1,end);
    }
    return sum;
}

/*自己写的(错误)

int p(int n,int c){
 int s=0;
    if(c==1){
        return a[n];
    }
    for(;n<2;n++){
       s+=a[n]+p(n+1,c-1);
    }
    return s;
}

*/

*****************************************************************


int main(){
    scanf("%d %d",&n,&k);
    for(i =0;i<n;i++)scanf("%d",&x[i]);
    printf("%d",rule(k,0,0,n-1));//调用递归解决问题
}

P1036 选数

标签:ready   生成   std   判断   isp   质数   include   main   范围   

原文地址:https://www.cnblogs.com/lijiahui-123/p/12236550.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!