2018年全国多校算法寒假训练营练习比赛(第二场)B - TaoTao要吃鸡
链接:https://www.nowcoder.com/acm/contest/74/B
来源:牛客网
题目描述
- Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了,
- 和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包
- 之后可以多携带h(h为0代表没有装备背包)重量的东西。玩了几天
- taotao发现了一个BUG,当装备背包之后,如果可携带重量没有满,就
- 可以拿一个任意重的东西。(解释看样例)有一天taotao空降到了一个
- 奇怪的岛上,岛上有n件装备,每个装备都有重量Wi和威力值Vi,但taotao
- 不认识这些装备,所以他来求助你,挑选威力最大的装备,帮助他吃鸡。
输入描述:
- 本题有多组输入(小于10),当n=0时结束输入。
第一行输入n,m,h。n,m,h为整数,并且0<=n,m,h<=100,
接下来n行,每行输入第i个物品的物品的重量Wi和威力值Vi。0<=Wi,Vi<=100.
输出描述:
- 输出最大威力值,每组输出一行。
输入例子:
- 3 3 3
- 2 3
- 3 2
- 2 3
- 0
输出例子:
- 8
-->
输入
- 3 3 3
- 2 3
- 3 2
- 2 3
- 0
输出
- 8
说明
- 可携带的总重量为6,当拿了前两件装备,此时容量为5/6,还可以再拿第三件物品。
题解
背包$dp$。
这题有个坑点,只有当$h$不为$0$的时候,才有$bug$。
即:$h$为$0$时,直接做$01$背包;$h$不为$0$时,可以枚举哪一个最后放进去,然后去除这个做$01$背包再算答案。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 200 + 10;
- int n, m, h;
- int dp[maxn];
- int w[maxn], v[maxn];
- int main() {
- while(~scanf("%d", &n)) {
- if(n == 0) break;
- scanf("%d%d", &m, &h);
- memset(dp, -1, sizeof dp);
- dp[0] = 0;
- for(int i = 1; i <= n; i ++) {
- scanf("%d%d", &w[i], &v[i]);
- if(w[i] == 0) dp[0] += v[i];
- }
- int ans = 0;
- if(h == 0) {
- for(int i = 1; i <= n; i ++) {
- if(w[i] == 0) continue;
- if(v[i] == 0) continue;
- for(int j = m; j >= w[i]; j --) {
- if(dp[j - w[i]] == -1) continue;
- dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
- }
- }
- for(int i = 0; i <= m; i ++) {
- ans = max(ans, dp[i]);
- }
- } else {
- ans = dp[0];
- for(int t = 1; t <= n; t ++) {
- if(w[t] == 0 || v[t] == 0) continue;
- for(int i = 1; i <= m + h; i ++) {
- dp[i] = -1;
- }
- for(int i = 1; i <= n; i ++) {
- if(w[i] == 0 || v[i] == 0) continue;
- if(i == t) continue;
- for(int j = m + h; j >= w[i]; j --) {
- if(dp[j - w[i]] == -1) continue;
- dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
- }
- }
- for(int i = 0; i <= m + h; i ++) {
- ans = max(ans, dp[i]);
- }
- for(int i = 0; i <= m + h - 1; i ++) {
- if(dp[i] == -1) continue;
- ans = max(ans, dp[i] + v[t]);
- }
- }
- }
- printf("%d\n", ans);
- }
- return 0;
- }
2018年全国多校算法寒假训练营练习比赛(第二场)B - TaoTao要吃鸡的更多相关文章
- 2018年全国多校算法寒假训练营练习比赛(第四场)B:道路建设
传送门:https://www.nowcoder.net/acm/contest/76/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 65536K,其他语言131072K 64b ...
- 2018年全国多校算法寒假训练营练习比赛(第四场)F:Call to your teacher
传送门:https://www.nowcoder.net/acm/contest/76/F 题目描述 从实验室出来后,你忽然发现你居然把自己的电脑落在了实验室里,但是实验室的老师已经把大门锁上了.更糟 ...
- 牛客网-2018年全国多校算法寒假训练营练习比赛(第四场)-A
解题思路:二分图的最大匹配,但这题是所有点都遍历一遍,所以答案/2: 代码: #include<iostream> #include<algorithm> #include&l ...
- 2018年全国多校算法寒假训练营练习比赛(第一场)闯关的lulu
闯关的lulu 链接:https://www.nowcoder.com/acm/contest/67/J 来源:牛客网 题目描述 勇者lulu某天进入了一个高度10,000,000层的闯关塔,在塔里每 ...
- 2018年全国多校算法寒假训练营练习比赛(第一场)D N阶汉诺塔变形
https://www.nowcoder.com/acm/contest/67/D 思路: 先手动模拟一下过程,以下是模拟过程,按顺序表示第几步需要移动的盘标号 1 1 2 1 1 2 1 1 3 1 ...
- 2018年全国多校算法寒假训练营练习比赛(第一场)E 恋与程序员
https://www.nowcoder.com/acm/contest/67/E 思路: dfs 代码: #include<bits/stdc++.h> using namespace ...
- 2018年全国多校算法寒假训练营练习比赛(第一场)G 圆圈
https://www.nowcoder.com/acm/contest/67/G 思路: 分形. 记录中间左边点的坐标,然后推出另外3个点的坐标,递归到最简单的情况. 代码: #include< ...
- 2018年全国多校算法寒假训练营练习比赛(第一场)C 六子冲
https://www.nowcoder.com/acm/contest/67/C 思路: 模拟. 代码: #include<bits/stdc++.h> using namespace ...
- 2018年全国多校算法寒假训练营练习比赛(第二场)F - 德玛西亚万岁
链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 题目描述 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀 ...
随机推荐
- idea 常用快捷使用
一.智能提示 1.快速移动到错误代码 :Shift+F2 或者 f2/ 2.快速修复:Alt+Enter 3.快速生成括号:Ctrl+Shift+Enter 二.重构 1.重构功能汇总:Ctrl+Sh ...
- 【BZOJ】3160: 万径人踪灭 FFT+回文串
[题意]给定只含'a'和'b'字符串S,求不全连续的回文子序列数.n<=10^5. [算法]FFT+回文串 [题解]不全连续的回文子序列数=回文子序列总数-回文子串数. 回文子串数可以用回文串算 ...
- 博皮设计:HTML/CSS/Javascript 源码共享
首先感谢 sevennight 对我的大力帮助,由此他也成为了我的第一位园友:其次,由于本人并不了解 HTML/CSS,因此几乎都在 李宝亨 设计的 博皮源码 的基础上进行的修改:最后,为了获得 更加 ...
- Tju_Oj_2790Fireworks Show
这个题主要在于时间复杂度的计算,N是10的6次方,C是10的2次方,OJ系统可接受的时间是10的7次方(室友说是无数先人测出来了┭┮﹏┭┮),所以如果普通遍历的话肯定会超时.而代码中是跳着走了,相当于 ...
- Python文件操作-文件的增删改查
需求:对文件进行增删改查 由于时间原因,本次代码没有增加任何注释,如有疑问,请联系编辑者:闫龙 其实我也是醉了,看着这些个代码,我脑袋也特么大了,没办法,大神说了,不让用新知识,只可以使用学过的,所以 ...
- Linux基础-sed+正则表达式
1,删除文件每行的第一个字符:sed -r 's/^.//g' passwd 2,删除文件每行的第二个字符:sed -r 's/^(.)(.)/\2/g' passwd 3,删除文件每行的最后一个字符 ...
- equals方法变量和常量位置区别
对于字符串比较,我的习惯用法是 变量.equals(常量) 比如: a.equals("a") 今天看视频才知道变量在前面与后面有很大影响,正确的写法是常量放前面(可以 ...
- 【HASPDOG】卸载
rpm -qa | grep aksusdb rpm -e aksusdb... rm -rf /var/hasplm
- 一个不错的linux学习资料下载的网址
本文比较完整的讲述GNU make工具,涵盖GNU make的用法.语法.同时重点讨论如何为一个工程编写Makefile.作为一个Linux程序员,make工具的使用以及编写Makefile是必需的. ...
- 转载: 开源整理:Android App新手指引开源控件
http://blog.coderclock.com/2017/05/22/android/open-source-android-app-guide-view-library/ 开源整理:Andro ...