• 白书-部分和问题


    部分和问题
    时间限制:1000 ms  |  内存限制:65535 KB
    难度:2
    描述
    给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
    输入
    首先,n和k,n表示数的个数,k表示数的和。
    接着一行n个数。
    (1<=n<=20,保证不超int范围)
    输出
    如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO”
    样例输入
    4 13
    1 2 4 7
    样例输出
    YES
    2 4 7

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 using namespace std;
     5 
     6 int n,k,sum,v;
     7 int a[30],b[30];
     8 
     9 void dfs(int x)
    10 {
    11     // 大于等于k时,剪枝
    12     if(sum>=k)
    13     {
    14         if(sum==k)
    15         {
    16             if(v==1)
    17             {
    18                 v=0;
    19                 printf("YES
    ");
    20             }
    21             for(int i=0;i<n;++i)
    22             {
    23                 if(b[i])
    24                 {
    25                     printf("%d ",a[i]);
    26                 }
    27             }
    28             printf("
    ");
    29         }
    30         return;
    31     }
    32     // 搜索终止条件
    33     if(x==n)
    34     {
    35         return;
    36     }
    37 
    38     for(int i=x;i<n;++i)
    39     {
    40         sum+=a[i];
    41         b[i]=1;
    42         dfs(i+1);
    43 
    44         sum-=a[i];
    45         b[i]=0;
    46     }
    47 }
    48 
    49 int main()
    50 {
    51     while(scanf("%d %d",&n,&k)!=EOF)
    52     {
    53         v=1;
    54         memset(b,0,sizeof(b));
    55         for(int i=0;i<n;++i)
    56         {
    57             scanf("%d",&a[i]);
    58         }
    59         sum=0;
    60         dfs(0);
    61         if(v)
    62         {
    63             printf("NO
    ");
    64         }
    65     }
    66 
    67     return 0;
    68 }
  • 相关阅读:
    hdu 2137
    hdu 2059
    hdu 2175
    hdu 1297
    hdu 1702
    hdu 1212
    hdu 1397
    [转]常见的碱性食品有哪些?
    [转]C#反射
    每个人都有自己的未来
  • 原文地址:https://www.cnblogs.com/jishuren/p/12244597.html
Copyright © 2020-2023  润新知