链接:https://www.nowcoder.com/acm/contest/74/B
来源:牛客网

题目描述

  1. Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了,
  2. 和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包
  3. 之后可以多携带hh0代表没有装备背包)重量的东西。玩了几天
  4. taotao发现了一个BUG,当装备背包之后,如果可携带重量没有满,就
  5. 可以拿一个任意重的东西。(解释看样例)有一天taotao空降到了一个
  6. 奇怪的岛上,岛上有n件装备,每个装备都有重量Wi和威力值Vi,但taotao
  7. 不认识这些装备,所以他来求助你,挑选威力最大的装备,帮助他吃鸡。

输入描述:

  1. 本题有多组输入(小于10),当n=0时结束输入。
    第一行输入n,m,hnmh为整数,并且0<=n,m,h<=100
    接下来n行,每行输入第i个物品的物品的重量Wi和威力值Vi0<=Wi,Vi<=100.

输出描述:

  1. 输出最大威力值,每组输出一行。

输入例子:
  1. 3 3 3
  2. 2 3
  3. 3 2
  4. 2 3
  5. 0
输出例子:
  1. 8

-->

示例1

输入

  1. 3 3 3
  2. 2 3
  3. 3 2
  4. 2 3
  5. 0

输出

  1. 8

说明

  1. 可携带的总重量为6,当拿了前两件装备,此时容量为5/6,还可以再拿第三件物品。

题解

背包$dp$。

这题有个坑点,只有当$h$不为$0$的时候,才有$bug$。

即:$h$为$0$时,直接做$01$背包;$h$不为$0$时,可以枚举哪一个最后放进去,然后去除这个做$01$背包再算答案。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 200 + 10;
  5. int n, m, h;
  6. int dp[maxn];
  7. int w[maxn], v[maxn];
  8.  
  9. int main() {
  10. while(~scanf("%d", &n)) {
  11. if(n == 0) break;
  12. scanf("%d%d", &m, &h);
  13. memset(dp, -1, sizeof dp);
  14. dp[0] = 0;
  15. for(int i = 1; i <= n; i ++) {
  16. scanf("%d%d", &w[i], &v[i]);
  17. if(w[i] == 0) dp[0] += v[i];
  18. }
  19. int ans = 0;
  20. if(h == 0) {
  21. for(int i = 1; i <= n; i ++) {
  22. if(w[i] == 0) continue;
  23. if(v[i] == 0) continue;
  24. for(int j = m; j >= w[i]; j --) {
  25. if(dp[j - w[i]] == -1) continue;
  26. dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
  27. }
  28. }
  29. for(int i = 0; i <= m; i ++) {
  30. ans = max(ans, dp[i]);
  31. }
  32. } else {
  33. ans = dp[0];
  34. for(int t = 1; t <= n; t ++) {
  35. if(w[t] == 0 || v[t] == 0) continue;
  36. for(int i = 1; i <= m + h; i ++) {
  37. dp[i] = -1;
  38. }
  39. for(int i = 1; i <= n; i ++) {
  40. if(w[i] == 0 || v[i] == 0) continue;
  41. if(i == t) continue;
  42. for(int j = m + h; j >= w[i]; j --) {
  43. if(dp[j - w[i]] == -1) continue;
  44. dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
  45. }
  46. }
  47. for(int i = 0; i <= m + h; i ++) {
  48. ans = max(ans, dp[i]);
  49. }
  50. for(int i = 0; i <= m + h - 1; i ++) {
  51. if(dp[i] == -1) continue;
  52. ans = max(ans, dp[i] + v[t]);
  53. }
  54. }
  55. }
  56. printf("%d\n", ans);
  57. }
  58. return 0;
  59. }

2018年全国多校算法寒假训练营练习比赛(第二场)B - TaoTao要吃鸡的更多相关文章

  1. 2018年全国多校算法寒假训练营练习比赛(第四场)B:道路建设

    传送门:https://www.nowcoder.net/acm/contest/76/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 65536K,其他语言131072K 64b ...

  2. 2018年全国多校算法寒假训练营练习比赛(第四场)F:Call to your teacher

    传送门:https://www.nowcoder.net/acm/contest/76/F 题目描述 从实验室出来后,你忽然发现你居然把自己的电脑落在了实验室里,但是实验室的老师已经把大门锁上了.更糟 ...

  3. 牛客网-2018年全国多校算法寒假训练营练习比赛(第四场)-A

    解题思路:二分图的最大匹配,但这题是所有点都遍历一遍,所以答案/2: 代码: #include<iostream> #include<algorithm> #include&l ...

  4. 2018年全国多校算法寒假训练营练习比赛(第一场)闯关的lulu

    闯关的lulu 链接:https://www.nowcoder.com/acm/contest/67/J 来源:牛客网 题目描述 勇者lulu某天进入了一个高度10,000,000层的闯关塔,在塔里每 ...

  5. 2018年全国多校算法寒假训练营练习比赛(第一场)D N阶汉诺塔变形

    https://www.nowcoder.com/acm/contest/67/D 思路: 先手动模拟一下过程,以下是模拟过程,按顺序表示第几步需要移动的盘标号 1 1 2 1 1 2 1 1 3 1 ...

  6. 2018年全国多校算法寒假训练营练习比赛(第一场)E 恋与程序员

    https://www.nowcoder.com/acm/contest/67/E 思路: dfs 代码: #include<bits/stdc++.h> using namespace ...

  7. 2018年全国多校算法寒假训练营练习比赛(第一场)G 圆圈

    https://www.nowcoder.com/acm/contest/67/G 思路: 分形. 记录中间左边点的坐标,然后推出另外3个点的坐标,递归到最简单的情况. 代码: #include< ...

  8. 2018年全国多校算法寒假训练营练习比赛(第一场)C 六子冲

    https://www.nowcoder.com/acm/contest/67/C 思路: 模拟. 代码: #include<bits/stdc++.h> using namespace ...

  9. 2018年全国多校算法寒假训练营练习比赛(第二场)F - 德玛西亚万岁

    链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 题目描述 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀 ...

随机推荐

  1. Webpack的安装、配置与执行

    先用npm安装 npm install webpack -g 然后在项目路径下进行项目安装 npm init # 会自动生成一个package.json文件 npm install webpack - ...

  2. 悲催的IE6 七宗罪大吐槽(带解决方法)第三部分

    五:文字溢出bug(注释bug) 1.在以下情况下将会引起文字溢出bug 一个容器包含2两个具有“float”样式的子容器. 第二个容器的宽度大于父容器的宽度,或者父容器宽度减去第二个容器宽度的值小于 ...

  3. 阿里云的OCS缓存机制

    OCS简介 OCS( Open Cache Service)为分布式高速缓存服务,主要实现热点数据的快速响应: OCS支持Key/Value的数据结构,兼容memcachebinary protoco ...

  4. c++ new 和delete

    c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间 ...

  5. java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)

    最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑! 获取本地图片路径: String bgPath = Thread.current ...

  6. aarch64_g3

    glibc-langpack-wal-2.25-6.fc26.aarch64.rpm 2017-06-20 17:08 210K fedora Mirroring Project glibc-lang ...

  7. dstat 服务器性能查看命令【转】

    一. 安装和简解 # yum -y install dstat# dstat CPU状态:CPU的使用率.这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况.如果你看 ...

  8. APUE-文件和目录(二)函数access,mask,chmod和粘着位

    4.7 函数access和faccessat 当一个进程使用了设置用户ID和设置组ID作为另一个用户(或者组)运行时,这时候有效用户(组)ID和实际用户(组)ID不一样,但进程仍然希望测试实际用户(组 ...

  9. linux文件管理 -> 系统目录结构

    几乎所有的计算机操作系统都是用目录结构组织文件.具体来说就是在一个目录中存放子目录和文件, 而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树的分支, 所以该 ...

  10. Flask:abort()函数

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 abort()函数用于提前退出(Google翻译abort)一个请求,并用指定的错误码返回. 函数原型如下: flas ...