多重背包问题---超详细讲解+优化(不懂你揍我)

本文详细介绍了多重背包问题的解决方法,包括如何将其转化为01背包和完全背包问题。通过状态表示、优化策略如二进制优化和单调队列优化,以及具体代码实现,阐述了解题思路和提高算法效率的关键步骤。

多重背包我们其实可以看成为01背包完全背包组合。也可以把多重背包问题转换成01背包问题,我们一起来看看解题思路。

1.状态表示

DP问题我们先来看状态表示,

二维数组的表示,F[i][j]代表到 i 个物品时,当前背包容量为 j 时所能拿到的最大价值。非常容易理解,我们主要考虑一下优化,用一维数组来表示,则用 F [j] 代表当前背包容量为 j时所能拿到的最大价值。第i个物体的体积为v[i],价值为 w [i]。

然后我们就看如何把多重背包转换成01背包与完全背包。

当然,01背包和完全背包转移方程都是

F [j]=max(F [j], F [ j- v [i] ]+ w [i])

2.转换

(1)转换为01背包

我们知道,01背包问题指的是各个物品只有一件,但在多重背包问题中,我们每种物品有 Si 件。

我们可以考虑将多个同种物品合成一件物品。比如,我们有10件t恤,一件占空间2,每件价值20元,我们将8件t恤合在一起,就变成了一件1占空间为16的价值160元的t恤。如此一来,多重背包问题就被我们转换为01背包问题啦。

换一种更为简单的说法,我们本身的问题就是不知道一种占用空间 Vi ,价值为 Wi,数量为 Si 的物品该拿多少件,我们就把该拿多少件枚举一下,假设为 k件(1<=k<=Si) ,然后我们就把问题看成仅有一件的占用空间k*Vi ,价值为k*Wi的物品该不该拿。这么说就应该很容易理解了,然后我们要做的就是,在判断这个k件物品合成的 大物件该不该拿之前,先枚举 k 的大小就可以了。

(2)小优化,转化为01+完全背包

前面我们是把所有物品全部转化成01背包来做,但是我们想一想,是不是有的物品可以转化成完全背包呢?

完全背包问题是每件物品全部是无限件。我们这里有无限拿的物品吗?我们可以想想,总的背包体积就是 V ,是已经确定了的,如果我们有一种物品占用体积为 v,共有 s 件,但s*v >=V,不就代表着我们连 s 件物品都不可能拿完背包就已经塞不下了吗?所以这种情况我们可以转换成完全背包来做,只需要加一个判断就可以了。

为什么要转换成完全背包?我们看上面转化成01背包是需要枚举一下拿多少件的,而转化为完全背包是不需要枚举多少件的,可以拿我们就拿

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值