HIT1485 A Good Helper(0-1背包)

Posted hyp1231

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HIT1485 A Good Helper(0-1背包)相关的知识,希望对你有一定的参考价值。

终于补完第二次期末考了……果然考场上心态不好导致好多会做的题都没时间写

 

题目链接:

  http://acm.hit.edu.cn/hoj/problem/view?id=1485

题目描述:

A Good Helper

 

Submitted : 713, Accepted : 320

Abraham and Calford are Moving their things from dormitory A11 to A9,and they have their own carry limit,they can‘t carry things which is beyond their limit and they will not carry one bag together. They want things to be carried in one time,when they can‘t deal with so many things, they will hire a good helper to help them, who can only carry one bag of things, regardless of the weight of it. Your task is to tell whether they can carry their bags in one time,or not.

Input
There are multiple test cases.
First line of each test case contains two nonnegative numbers, A and C, (0 < A,C <=1000) representing the limit of Abraham and Calford,then the second line contains an integer N ( 0 < N <= 200 ) ,representing the number of bags,followed by N positive integers,each of them is not more than 100.

Output
For each test case
Output "Yes" if they can carry the bags without the help of the helper in one time. 
Output "Need a helper" if they can only carry the bags with the help of the helper in one time.
Output "No" if they can‘t carry the bags in one time.

Sample Input

7 7
3 5 5 5
7 7
3 5 2 5
7 7
3 7 8 7
7 7
3 7 8 9

 

Sample Output

Need a helper
Yes
Need a helper
No

 

题目大意:

  两个人搬东西,给你各自能搬的最大重量,这时如果还剩一个东西搬不动,可以请一个帮手,帮手只能搬一个东西但不限重量

  问能否一次办完并是否需要帮手

思路:

  先贪心取得最大重量得物品给帮手搬,求出剩下的和

  以A的容量做0-1背包,看剩下的容量C能否搬动

  如果C的容量减去剩余的容量还能把帮手手中的物品搬动,则不需要帮手

 

代码:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N = 210;
 8 
 9 int num[N], dp[5 * N] = { 0 };
10 
11 int main() {
12     int A, C, n, sum, best, res;
13     while (cin >> A >> C) {
14         cin >> n;
15         sum = best = 0;
16         for (int i = 1; i <= n; ++i) {
17             scanf("%d", &num[i]);
18             sum += num[i];
19             if (num[i] > best) { best = num[i]; res = i; }
20         }
21         sum -= best;    //除去最大后的剩余和
22         memset(dp, 0, sizeof(dp));
23         for (int i = 1; i <= n; ++i) if (i != res)    //0-1背包
24             for (int j = A; j >= num[i]; --j)
25                 dp[j] = max(dp[j], dp[j - num[i]] + num[i]);
26         if (sum - dp[A] > C)printf("No\n");    //有帮手C也拿不动
27         else if (sum - dp[A] + best <= C)printf("Yes\n");    //C还可以再拿帮手拿的那个东西
28         else printf("Need a helper\n");    //C拿不动最大的东西,但剩下的可以和A分掉
29     }
30 }

 

以上是关于HIT1485 A Good Helper(0-1背包)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 1485 火枪打怪

[bzoj1485] [HNOI2009]有趣的数列

1485 字符配对

清澄 A1485. Catch The Penguins 抓企鹅

如何在 PySpark 中对 groupby 数据框应用条件

CodeForces - 1485F Copy or Prefix Sum(dp)