NYOJ 1058 深度搜索

来源:互联网 发布:电脑软件消失 编辑:程序博客网 时间:2024/06/05 23:01

部分和问题

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



0 0
原创粉丝点击