您的位置:首页 > 其它

NYOJ 1058 部分和问题 (DFS)

2016-06-17 17:05 288 查看
题目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


#include <iostream>
#include <cstring>
using namespace std;

int n, k;
int a[25], b[25];

//已经从前i项得到了和sum,然后对于i项之后的进行分支
bool dfs(int i, int sum)
{
//如果前i项都计算过了,则返回sum是否与k相等
if (i == n)
return sum == k;
b[i] = 0;
//不加上a[i]的情况
if (dfs(i + 1, sum))
return true;
b[i] = 1;
//加上a[i]的情况
if (dfs(i + 1, sum + a[i]))
return true;
//无论是否加上a[i]都不能凑成k就返回false
return false;
}

int main()
{
while (cin >> n >> k){
for (int i = 0; i < n; i++)
cin >> a[i];
if (dfs(0, 0)){
cout << "YES" << endl;
for (int i = 0; i < n; i++){
if (b[i])
cout << a[i] << " ";
}
cout << endl;
}
else
cout << "NO" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: