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.
}
相关文章推荐
- 迅雷会员帐号获取器
- 请求接口数据
- 关于 UIWebView 加载后为空白页
- jquery 实现点击按钮后倒计时效果
- Note:This element neither has attached source nor attached Javadoc
- iOS 自定义TabBarController
- velocity语法大全
- bzoj2012[hnoi2005]狡猾的商人
- Note:This element neither has attached source nor attached Javadoc
- 查看linux系统版本
- js数组去重复的方法
- request的属性
- 事务的传播特性
- hibernate的NativeSql查询
- CCD工作原理
- 深度学习(三)theano学习笔记(2)基础函数-未完待续
- 产品策划三:App启动页的策划方案
- goldengate ERROR OGG-01172
- 通过NFSv3挂载HDFS到本地目录 -- 2续hdfs-nfs网关解决错误
- SELinux