首页 > 代码库 > NYOJ-1058 部分和问题
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
01.
#include<iostream>
02.
#include<cstring>
03.
#include<cstdio>
04.
using
namespace
std;
05.
int
n,k,v,sum,a[25],b[25];
06.
void
dfs(
int
p)
07.
{
08.
if
(sum>=k)
09.
{
10.
if
(sum==k)
11.
{
12.
if
(!v)
13.
{
14.
v=1;
15.
cout<<
"YES"
<<endl;
16.
}
17.
for
(
int
i=0;i<n;i++)
18.
if
(b[i])
19.
cout<<a[i]<<
" "
;
20.
cout<<endl;
21.
}
22.
return
;
23.
}
24.
for
(
int
i=p;i<n;i++)
25.
{
26.
sum+=a[i];
27.
b[i]=1;
28.
dfs(i+1);
29.
sum-=a[i];
30.
b[i]=0;
31.
}
32.
}
33.
int
main()
34.
{
35.
while
(
scanf
(
"%d%d"
,&n,&k)==2)
36.
{
37.
v=0;
38.
memset
(b,0,
sizeof
(b));
39.
for
(
int
i=0;i<n;i++)
40.
cin>>a[i];
41.
sum=0;
42.
dfs(0);
43.
if
(!v)
44.
cout<<
"NO"
<<endl;
45.
}
46.
return
0;
47.
}
NYOJ-1058 部分和问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。