首页 > 代码库 > 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 131 2 4 7
样例输出
YES2 4 7
来源
经典题目
上传者
TC_杨闯亮

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

 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 long10 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