0-1背包再次访问

时间:2012-06-07 08:42:15

标签: algorithm dynamic knapsack-problem

嗯,这是一个旧的0-1背包问题,但在找到我可以获得的最高总价后,我需要找到我可以携带的物品。但对于以下测试用例(共3项)

10 (max weight that I can carry)
5 3 (weight and value for each item)
5 2
6 5

此处最高价格为5.但是对于重量,它可以是610(5+5)。两者都会给出相同的价格,但显然可行的是服用6公斤而不是10公斤。我想提示如何从dp矩阵计算出来。我为这个测试用例得到了以下矩阵。

0 0 0 0 3 3 3 3 3 3 
0 0 0 0 3 3 3 3 3 5 
0 0 0 0 3 5 5 5 5 5 

使用这个算法,它发现体重为10,但最佳体重为6公斤。

i=n, k=W(max weight)// n= total items

while i,k > 0

if dp[i,k] ≠ dp[i−1,k] then 
mark the ith item as in the knapsack
i = i−1, k = k-w(weight of ith item)

else
i = i−1

1 个答案:

答案 0 :(得分:0)

简单的解决方案是在不同尺寸的袋子上迭代运行背包算法,并选择最小的袋子,它仍然可以提供与原始袋子相同的价值。

可以使用[0,W]上的binary search来完成此操作 - 因此您将运行总计O(logW)次的背包算法,从而为您提供总共O(nW*log(W))个解决方案最大值和最小可能的包尺寸。

如何暗示二元搜索的想法:
让原始包的大小为W,运行knapsack(W,items),然后获取value。现在检查knapsack(W/2,items)是否仍然返回value。如果是的话 - 搜索范围(0,W/2]。如果没有,请在范围(W/2,W]中搜索,直到找到返回value的最小行李尺寸。