多重背包问题性质
一个背包,它最大能收纳的重量为 $packWeight$。
一组物品,每种物品有一个或多个,第 $i$ 种物品的重量为 $weights[i]$,价值为 $values[i]$,数量为 $nums[i]$。
求背包能容纳的物品最大价值。这就是多重背包问题,很显然其与 $01$ 背包 和 完全背包 的差别是:
问题分析
在 $01$ 背包 问题中,物品只能选择一次,在实现中使用逆序遍历背包来防止物品被重复选取。
在 完全背包 问题中,物品可以选择无数次,在实现中通过正序遍历背包来处理。
而在多重背包中,物品有指定的数量,以上两种处理方式都无法满足了。直观的想法是需要在处理的过程中控制选择物品的次数。
另一种方案就是将多重背包转化为 $01$ 背包,只要把物品列表里的物品按照其数量展开就可以了。
例如:
将物品展开
接下来问题就转化为了 $01$ 背包 问题。
golang 代码实现
1 | func MultiPack(packWeight int, weights, values, nums []int) int { |