• 洛谷 P1036 选数【背包型DFS/选or不选】


    题目描述

    已知 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

    【代码】:
    #include<cstdio>
    #include<cmath>
    using namespace std;
    const int maxn = 22;
    int a[maxn];
    int ans,n,k;
    bool isprime(int num)
    {
        for(int i=2;i<=sqrt(num);i++)
        if(num%i==0)
            return false;
        return true;
    }
    void dfs(int cur,int cnt,int num)//一个传递当前选择的数的下标,一个传递已选择数的个数,一个选择以选择的数的总和
    {
        if(cnt==k)
        {
            if(isprime(num))
            {
               ans++;
            }
            return ;
        }
        for(int i=cur;i<=n;i++)
        {
            dfs(i+1,cnt+1,num+a[i]);
        }
    }
    int main()
    {
        //freopen("choose.in","r",stdin);
        //freopen("choose.out","w",stdout);
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        dfs(1,0,0);
        printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    Retrofit2.0+OkHttp打印Request URL(请求地址参数)
    Java如何从HttpServletRequest中读取HTTP请求的body
    解决gradle:download特别慢的问题
    20180531
    20180531 运算符重载
    20180531 二叉树
    20180530
    20180529-2
    20180529-1
    20180529
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7966887.html
Copyright © 2020-2023  润新知