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
来源
经典题目
上传者
TC_杨闯亮

解题:一顿乱搜。。。。。。

NYOJ 1058 部分和问题
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <cstdlib>

 5 #include <vector>

 6 #include <climits>

 7 #include <algorithm>

 8 #include <cmath>

 9 #define LL long long

10 using namespace std;

11 int n,d[21],ans[21],m,res;

12 bool dfs(int cur,int add,int tot) {

13     if(cur >= n) {

14         if(add == res) {

15             m = tot;

16             return true;

17         }

18         return false;

19     }

20     if(dfs(cur+1,add,tot)) {

21         return true;

22     }

23     if(dfs(cur+1,add+d[cur],tot+1)) {

24         ans[tot] = d[cur];

25         return true;

26     }

27     return false;

28 }

29 int main() {

30     while(~scanf("%d %d",&n,&res)) {

31         int i;

32         for(int i = 0; i < n; i++)

33             scanf("%d",d+i);

34         if(dfs(0,0,0)) {

35             puts("YES");

36             for(i = 0; i+1 < m; i++)

37                 printf("%d ",ans[i]);

38             printf("%d\n",ans[i]);

39         } else puts("NO");

40     }

41     return 0;

42 }
View Code

 

 

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