问题描述
具体的问题描述请参考以下链接:
假设我们有以下一组数据:
背包可承受的最大重量:10kg
item重量和价值如下:
weight value
item1 5kg 60元 --> 指5kg item1的价值为60元
item2 3kg 50元
item3 2kg 70元
item4 1kg 30元
在上方链接的文章中,当我们要去计算能够被拿走的物品的最大价值的时候,我们使用的是物品的单价(即每千克这个物品的价值是多少),然后去做Greedy Algorithm的计算,即当有5kg item1的时候我们可以只拿走2kg。因此如果使用链接中的代码来运行的话,背包中应该放如下物品:
2kg 的 item3 --> value is 2 x 35 = 70
1kg 的 item4 --> value is 1 x 30 = 30
3kg 的 item2 --> value is 3 x 16.666 = 50
4kg 的 item1 --> value is 4 x 12 = 48
最大价值等于 198
但是,0/1 Knapsack Problem与上方问题不同的是,0/1 Knapsack Problem需要解决的是如何在不拆分物品的条件下去计算出物品的最大价值。比如现有5kg的item1价值60元,那么我们在拿的时候,要么5kg全部拿走,要么不拿,即不能像上面的例子中只拿走4kg。
Knapsack Problem算法解析
分两种情况来解析:
Knapsack with repetitions:指不限制每一个item的组合(重量和价格)的数量。
Knapsack without repetitions (use dynamic programming):指每一个item的组合只有一个。
假设我们有以下一组数据:
weight_list = [5, 3, 2, 1]
value_list = [60, 50, 70, 30]
比如同样针对这组数据,当背包最大承受重量为4kg的时候:
Knapsack with repetitions:我们可以用2组item3(总重量等于4kg),此时的最大价值为140元。
Kna