用分数背包方法解决背包

时间:2016-12-13 11:21:50

标签: algorithm dynamic-programming greedy

有两个众所周知的背包问题:

1)给定n个项目,每个项目都有weightcost。我们需要选择适合我们背包的物品,并且总和成本最高。可以使用dynamic programming轻松解决。

2)分数背包:与第一个背包相同,但我们不能只考虑整个项目,而是它的一部分。使用greedy algorithm可以轻松解决此问题。

想象一下,我们正在使用第二个问题的greedy algorithm来解决第一个问题。我怎样才能证明,我们得到的解决方案不会比最优解决方案差两倍?

1 个答案:

答案 0 :(得分:4)

据我所知,贪婪的解决方案可能与你想要的效率一样低。 想象一下,你有一个容量为1和两个(n = 2)物品的背包:

item weight cost density
------------------------
   A      ε    ε       1  <- greedy choice
   B      1  1-ε     1-ε  <- optimal choice

因此,当最优解为时,贪婪算法会花费A ε成本 以B费用获取1-ε费用。选择的(贪婪的)解决方案是

  (1-ε)/ε = 1/ε - 1 

时效低于最佳效率。尽可能少地ε(例如,ε = 1e-100)并使用非常低效的贪婪解决方案。

修改:如果只是整数值,只需比例上面的示例:你有一个容量为X的背包和两个({{1} })项目

n = 2

在这种情况下,贪婪的解决方案是

item weight cost density
------------------------
   A      1    1       1  <- greedy choice
   B      X  X-1   1-1/X  <- optimal choice

时效低于最佳效率。最后,让 (X - 1) / 1 = X - 1 足够大(例如,X