zoukankan      html  css  js  c++  java
  • 选数

    题目描述

    已知 nn个整数 x1,x2,…,xn,以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,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=293+7+19=29。

    输入输出格式

    输入格式:
    键盘输入,格式为:

    n,k(1≤n≤20,k<n)

    x 1,x 2 ,…,x n (1≤x i≤5000000)
    输出格式:
    屏幕输出,格式为: 11个整数(满足条件的种数)。

    输入输出样例

    输入样例1:
    4 3
    3 7 12 19
    输出样例1
    1

    参考代码:

    #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);//调用递归解决问题
    }
    
  • 相关阅读:
    Acwing199 余数之和
    试题 算法提高 WYF的交易地点(简单计算几何)
    试题 算法提高 八数码(bfs)
    试题 算法提高 合唱队形(dp)
    牛客练习 牛牛的mex(维护前缀后缀最小值)
    牛客练习 牛牛的算术(数学、规律)
    试题 算法提高 树的直径(dfs)
    高精度乘法(板子)
    试题 算法提高 不重叠的线段(dp)
    拜托了,牛老师(dfs)
  • 原文地址:https://www.cnblogs.com/yonglin1998/p/11780859.html
Copyright © 2011-2022 走看看