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.
}