洛谷 P1776 & HDU 2191 题解(单调队列优化多重背包)

题意简述

(按洛谷,HDU的输入顺序略有不同,还多组数据,较为毒瘤)

多重背包问题。给n,m,分别表示物品数量,背包总容积,每个物品依次给出3个属性w,v,c,表示物品的价值,重量,能选多少个。请在背包不爆炸的情况下选价值最大。

数据

输入:
4 20
3 9 3
5 9 1
9 4 2
8 1 3
输出:
47

思路

在朴素的多重背包中,我们设 f [ i ] [ j ] f[i][j] f[i][j]为考虑前 i i i个物品,然后背包容量为 j j j时的最优解。显然有 f [ i ] [ j ] = m a x { f [ i − 1 ] [ j − k ∗ v [ i ] ] + k ∗ w [ i ] } f[i][j]=max\{ f[i-1][j-k*v[i]]+k*w[i]\} f[i][j]=max{ f[i1][jkv[i]]+kw[i]},其中 0 &lt; = k &lt; = m i n { c [ i ] , m / v [ i ] } 0&lt;=k&lt;=min\{c[i],m/v[i]\} 0<=k<=min{ c[i],m/v[i]}。(注释: c [ i ] c[i] c[i]为当前物品能选多少个, m / v [ i ] m/v[i] m/v[i]是由于容量限制导致当前物品最多就能选 m / v [ i ] m/v[i] m/v[i]个,其中 / / / C + + C++ C++中的用法,表示下取整的除)。

我们会发现,这样高的时间复杂度过不去这个题目。那么,我们仔细观察一下 f f f的变化。

假如此时 n = 100000 , m &gt; 9 × v [ i ] n=100000,m&gt;9\times v[i] n=100000,m>9×v[i]设我们现在正在枚举 i i i,然后这个物品 i i i能选 2 2 2个,将 w [ i ] , v [ i ] w[i],v[i] w[i],v[i]简记为 w , v w,v w,v,将 f [ i − 1 ] [ j ] f[i-1][j] f[i1][j]简记为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值