Two Dimension Bag - 二维背包


问题

现有个珠宝(共种,每种个),已知第个珠宝的价值是,重量,重量。给你一个背包,你可以自由挑选珠宝装到背包中,但背包可以装载的最大重量,最大重量。求背包能够装载珠宝的最大价值

该问题与01背包的区别就是,重量属性变成了维属性,背包中所有珠宝的总重量不能超过,总重量不能超过

解法

为背包中放入前件物品,重量不大于,重量不大于的最大价值,其中。有如下状态转移方程:

初始化,背包中没有放入任何珠宝时

对于第个珠宝时,若装进背包,则背包的价值增大,剩余重量减小,剩余重量减小,即(其中);若不装入背包,则一切维持不变,即。选择这两种情形中的最大值;

即为个珠宝中重量不超,重量不超过的最大价值。该算法的时间复杂度是


源码

TwoDimensionBag.h

TwoDimensionBag.cpp

测试

TwoDimensionBagTest.cpp