zoukankan      html  css  js  c++  java
  • luogu P1036 选数 x

    P1036 选数

    题目描述

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

    输入输出格式

    输入格式:

    键盘输入,格式为:

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

    x1,x2,…,xn (1<=xi<=5000000)

    输出格式:

    屏幕输出,格式为:

    一个整数(满足条件的种数)。

    输入输出样例

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

      1

    思路:

      首先先用dfs搜一下,然后如果选完数,就判断当前计算出的这个数是否为素数,如果是素数,ans++(说明找出了一种情况)

      最后输出ans即可

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    
    int n,k,ans;
    int a[22];
    
    int pd(int x)
    {
        if(x==2||x==3) return 1;
        if(x%2==0 || x==1) return 0;
        int j=3;
        while(j<=sqrt(x)&&x%j!=0) j+=2;
        if(x%j==0) return 0;
        else return 1;
    }
    
    void dfs(int pos,int l,int sum)
    {
        if(!pos)///没有数能够继续被选择了 
        {
            int now=pd(sum);///当前所组成的和是否为素数 
            ans+=now;///如果是ans++ 
            return;
        }
        for(l;l<=n;l++)///从当前的数后面之中再选取一个 
            dfs(pos-1,l+1,sum+a[l]);///表示又选取一个数 
    }
    
    int main()
    {
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        dfs(k,1,0);
        printf("%d
    ",ans);
        return 0;
    }
    View Code

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    使用form表单上传文件
    繁星——JQuery选择器之层级
    繁星——jquery的data()方法
    running programmer——spring-01(初谈spring)
    django+javascrpt+python实现私有云盘代码
    prometheus+grafana 监控生产环境机器的系统信息、redis、mongodb以及jmx
    运维管理后台
    django+javascrpt+python实现私有云盘
    python logging模块
    python hashlib模块
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7019320.html
Copyright © 2011-2022 走看看