Complete Bag - 完全背包


问题

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

解法

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

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

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

即为个珠宝中重量不超过的最大价值。该算法的时间复杂度是,因为状态转移方程中的参数的规模与背包最大重量线性相关。


源码

CompleteBag.h

CompleteBag.cpp

测试

CompleteBagTest.cpp