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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值