博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018年全国多校算法寒假训练营练习比赛(第二场)B - TaoTao要吃鸡
阅读量:6942 次
发布时间:2019-06-27

本文共 2062 字,大约阅读时间需要 6 分钟。

链接:

来源:牛客网

题目描述

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.

输出描述:

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

输入

3 3 32 33 22 30

输出

8

说明

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

题解

背包$dp$。

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

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

#include 
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;}

 

转载于:https://www.cnblogs.com/zufezzt/p/8372340.html

你可能感兴趣的文章
让前端独立于后端进行开发,模拟数据生成器Mock.js
查看>>
微信公众平台开发—利用OAuth2.0获取微信用户基本信息
查看>>
golang遇到的win下读取txt字符乱码的问题
查看>>
Binary Search--二分查找
查看>>
《计算机图形学》2.1.6 三维观察设备 学习笔记
查看>>
QT在线
查看>>
以P2P网贷为例互联网金融产品如何利用大数据做风控?
查看>>
Polymer初探
查看>>
zprofiler三板斧解决cpu占用率过高问题(转载)
查看>>
深入浅出NIO Socket实现机制
查看>>
bzoj 1930: [Shoi2003]pacman 吃豆豆 [费用流]
查看>>
(数字IC)低功耗设计入门(三)——系统与架构级低功耗设计
查看>>
Dynamics CRM2016 新功能之从CRM APP中导出数据至EXCEL
查看>>
Android——推断Service是否已经启动
查看>>
subprocess模块
查看>>
大数据入门基础系列之初步认识大数据生态系统圈(博主推荐)
查看>>
linux下命令行的查找顺序
查看>>
基于HTML5 Canvas 点击添加 2D 3D 机柜模型
查看>>
详述 SQL 中的 distinct 和 row_number() over() 的区别及用法
查看>>
xshell 登陆堡垒机实现自动跳转
查看>>