部分和问题 (搜索)

D : 部分和问题  

时间限制:1 Sec 内存限制:64 MiB


题目描述

给定整数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<stdio.h>
  2. int n,k;
  3. int a[100],b[100];
  4. bool dfs(int i,int sum)//
  5. {if(i==n)
  6.         return sum==k ;
  7. //if(sum>k)return false;
  8.     if(dfs(i+1,sum))
  9.     {  b[i]=0;
  10.         return true;
  11.     }
  12.  
  13.     if(dfs(i+1,sum+a[i]))
  14.     { b[i]=1;
  15.         return true;
  16.     }
  17.  
  18.  
  19.     return false;
  20.  
  21. }
  22. int main()
  23. {
  24.      while(scanf("%d%d",&n,&k)!=EOF)
  25.     {
  26.         for(int i=0;i<n;i++)
  27.         {
  28.             scanf("%d",&a[i]);
  29.         }
  30.         if(dfs(0,0))
  31.         {
  32.              printf("YES\n");
  33.              for(int i=0;i<n;i++)
  34.              {
  35.                  if(b[i])
  36.                     printf("%d ",a[i]);
  37.              }
  38.              printf("\n");
  39.         }
  40.            else
  41.             printf("NO\n");
  42.     }
  43.     return 0;
  44. }

猜你喜欢

转载自blog.csdn.net/kuguotao/article/details/78712905