您的位置:首页 > 其它

NYOJ-1058 部分和问题

2014-07-22 11:30 183 查看


部分和问题

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