您的位置:首页 > 其它

NYOJ 1058 深度搜索

2016-01-25 15:57 204 查看


部分和问题

时间限制: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.
while
(
scanf
(
"%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.
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: