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

本博客探讨了如何使用单调队列优化来解决多重背包问题,通过分析f[i][j]的状态转移,揭示了在某些情况下可以利用滑动窗口和单调队列减少计算复杂度,从而求解价值最大的物品组合。文章提供了具体的思路分析和代码实现细节。

题意简述

(按洛谷,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]为考虑前iii个物品,然后背包容量为jjj时的最优解。显然有f[i][j]=max{ 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;=min{ 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++中的用法,表示下取整的除)。

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

假如此时n=100000,m&gt;9×v[i]n=100000,m&gt;9\times v[i]n=100000,m>9×v[i]设我们现在正在枚举iii,然后这个物品iii能选222个,将w[i],v[i]w[i],v[i]w[i],v[i]简记为w,vw,vw,v,将f[i−1][j]f[i-1][j]f[i1][j]简记为g(j)g(j)g(j)。然后开始第二层枚举jjj

j=6v,f[i][j]=max{ g(6v),g(5v)+w,g(4v)+2w}j=5v,f[i][j]=max{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值