当前位置:首页 > 动态规划 > 单调DP > 正文
洛谷P1776宝物筛选[NOI导刊]
2656+

题目大意:n种物品,价值是$a_i$,体积是$b_i$,数量是$c_i$,装入一个容量为m的背包,最大能装多少价值?

题目描述

终于,破解了千年的难题。小 FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物。

这下小 FF 可发财了,嘎嘎。但是这里的宝物实在是太多了,小 FF 的采集车似乎装不下那么多宝物。看来小 FF 只能含泪舍弃其中的一部分宝物了。

小 FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小 FF 有一个最大载重为 $W$ 的采集车,洞穴里总共有 $n$ 种宝物,每种宝物的价值为 $v_i$,重量为 $w_i$,每种宝物有 $m_i$ 件。小 FF 希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。

输入输出格式

输入格式

第一行为一个整数 $n$ 和 $W$,分别表示宝物种数和采集车的最大载重。

接下来 $n$ 行每行三个整数 $v_i,w_i,m_i$。

输出格式

输出仅一个整数,表示在采集车不超载的情况下收集的宝物的最大价值。

输入输出样例

输入样例 #1

4 20
3 9 3
5 9 1
9 4 2
8 1 3

输出样例 #1

47

说明

对于 $30\%$ 的数据,$n\leq \sum m_i\leq 10^4$,$0\le W\leq 10^3$。

对于 $100\%$ 的数据,$n\leq \sum m_i \leq 10^5$,$0\le W\leq 4\times 10^4$,$1\leq n\le 100$。

解题思路

转成01背包,会超时,所以考虑用二进制拆分或者单调队列优化,本文将介绍单调队列优化,如果需要看二进制拆分,请见上一篇文章。

首先,按照完全背包的做法,从小到大进行更新转移,会发现最小的更新是容量b,容量b只会更新到b+b、3b、4b……这样,我们就可以对于余数相同的容量单独处理。

其次,多重背包不能完全按照完全背包来做,因为数量并不是无限,所以转移的时候,需要判断前一个状态到当前状态是否超过c个物品!

对于前面的状态,我们需要选择一个价值最大的进行转移,如果后面的价值比前面大,那么前面的就不会被选择了,因为他“质量差”、“易过期”!

最后,我们就可以套用单调队列的做法,优化他!

程序实现

About

坚决不Copy代码!

本文标签:,,,,,,

洛谷P1776宝物筛选[NOI导刊]:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!