部分和问题
时间限制:
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
-
首先,n和k,n表示数的个数,k表示数的和。
dfs+栈
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;
int N, K, a[22], book[22], b[22];
bool f = false;
stack<int> v;
bool dfs(int step, int sum) {
if (step == N) return sum == K;
if (dfs(step+1, sum)) {
return true;
}
if (dfs(step+1, sum+a[step])) {
v.push(a[step]);
return true;
}
return false;
}
int main() {
while(~scanf("%d%d",&N, &K)) {
f = false;
for (int i = 0; i < N; i++) scanf("%d", &a[i]);
dfs(0, 0);
if (v.size() > 0) puts("YES");
while(v.size()) {
f = true;
printf("%d ", v.top());
v.pop();
}
if (!f) puts("NO");
}
return 0;
}