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

你可能感兴趣的:(问题)