部分和问题

 

试题描述

给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。

输入
第一行为两个整数n和k,n表示数的个数,k表示数的和。接下来一行为n个数a1、a2、...a。
输出
如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则输出“NO”
输入示例
4 13
1 2 4 7
输出示例
YES
2 4 7
其他说明
(1<=n<=20,保证不超int范围)
 
 1 #include <iostream>
 2 
 3 using namespace std;
 4 int a[100001],b[100001];
 5 int n,k,cnt=0;
 6 int dfs(int i,int sum)
 7 {
 8     if(i==n) return sum==k;  //先判断当前的sum是否和k相等 
 9     //开始分类讨论 
10     if(dfs(i+1,sum)==1) return 1;  //不加上a[i+1] 
11     if(dfs(i+1,sum+a[i])==1) {cnt++;b[cnt]=a[i];return 1;} //加上a[i+1] 
12     return 0; //无论加不加上都不等于k 
13 }
14 int main()
15 {
16     scanf("%d%d",&n,&k);
17     for(int i=0;i<n;i++) scanf("%d",&a[i]);
18     if(dfs(0,0)==1)   //从最开始递归,一直在内部自己调用自己,最终返回一个值 
19     {
20         printf("YES");    
21         printf("\n");    
22         printf("%d",b[cnt]); //格式要求 
23         for(int i=cnt-1;i>=1;i--) cout<<" "<<b[i];
24     }
25     else printf("NO");
26     //system("pause");
27     return 0;
28 }
部分和问题

经典递归

posted @ 2015-12-04 17:26  姚呵呵  阅读(230)  评论(0编辑  收藏  举报