部分和问题 南阳acm1058(递归+dfs)

部分和问题

时间限制: 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
来源
经典题目
上传者
TC_杨闯亮
简单的搜索问题,要注意它有多组测试数据
 1 #include<stdio.h>
 2 #include<string.h>
 3 int a[22],b[22];
 4 int n,k,flag;
 5 void dfs(int x,int sum)
 6 {
 7     int i;
 8     if(sum > k) return;    //此时不需要再相加了,已经超了
 9     if(x==n)
10     {
11         if(sum == k)
12         {
13             flag = 1;
14             printf("YES\n");
15             for(i=0; i<n; i++)
16             {
17                 if(b[i]) printf("%d ",a[i]);
18             }
19             printf("\n");
20             return;
21         }
22         return;
23     }
24     b[x] = 0;
25     dfs(x+1,sum);    //sum不需要+a[x]时,b[x] = 0
26     b[x] = 1;
27     dfs(x+1,sum+a[x]);    //sum+a[x]时,b[x] = 1
28 }
29 int main()
30 {
31     int i;
32     while(scanf("%d%d",&n,&k)!=EOF)
33     {
34             flag = 0;
35             memset(b,0,sizeof(b));
36         for(i=0; i<n; i++)
37             scanf("%d",&a[i]);
38         dfs(0,0);
39         if(!flag)
40             printf("NO\n");
41     }
42     return 0;
43 }

猜你喜欢

转载自www.cnblogs.com/-skyblue/p/9350864.html