NYOJ 1058 深度搜索

部分和问题

时间限制: 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


遇到的问题和思路:

        因为没有参加学校ACM的集训,所以只能自己在大冬天的家里补知识。说实话感觉和别人差距挺大的了。不过路还是要一步一个脚印的走下去,所以我决定按照书上给的例题一题一题做下去。

       这道题是书上的例题,打算看了以后再做一遍。首先这道题目和书上的例题不一样,还要求把样例输出,而且有个bug,最后一个多了一个空格都AC了,起初我还以为是PE。

      具体的思路就是:是否选择。仅此而已。


给出代码:


#include<cstdio>
02. #include<algorithm>
03. #include<cmath>
04. #include<cstring>
05.  
06. using namespace std;
07.  
08. int a[30];
09. bool b[30];
10. int n, k;
11.  
12. bool dfs(int i, int sum){
13. if(i == n)return sum == k;
14.  
15. if(dfs(i + 1,sum))return true;
16.  
17. if(dfs(i + 1,sum + a[i])){
18. b[i] = true;
19. return true;
20. }
21.  
22. return 0;
23. }
24.  
25. void solve(){
26. if (dfs(0, 0)){
27. printf("YES\n");
28. int count1 = 0;
29. for(int i = 0; i < n; i++){
30. if(b[i]&&count1 < 3)printf("%d ",a[i]);
31. }
32. printf("\n");
33. }
34. else printf("NO\n");
35. }
36.  
37. int main(){
38. whilescanf("%d%d", &n, &k)!=EOF){
39. memset(a , 0 , sizeof(a));
40. memset(b , 0 , sizeof(b));
41. for(int i = 0; i < n; i++){
42. scanf("%d", &a[i]);
43. }
44.  
45. solve();
46. }
47. return 0;
48. }



你可能感兴趣的:(NYOJ 1058 深度搜索)