【问题标题】:Solving knapsack with fractional knapsack approach用分数背包法求解背包
【发布时间】:2017-04-28 10:35:09
【问题描述】:

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

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

2) 碎片背包:和第一个一样,但我们不能只带整个项目,而是它的一部分。这个问题可以通过greedy algorithm轻松解决。

假设我们使用第二个问题中的greedy algorithm 来解决第一个问题。我如何证明我们将得到的解决方案比最优解决方案差不超过两倍?

【问题讨论】:

  • “更糟”是什么意思?
  • 您可能有更多限制,因为一般情况(重量、成本是双精度值,而不仅仅是整数值)对 DP 不太友好
  • @Alexander Anikin: int 不是限制 - 只是 按比例放大 我的答案 - 1e100 体积的背包;项目Aweight = 1cost = 1 和项目Bweight = 1e100 和成本1e100-1

标签: algorithm dynamic-programming greedy


【解决方案1】:

据我所见,贪婪的解决方案可以随心所欲地低效。 想象一下,你有一个容量为1 和两个(n = 2)物品的背包:

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

所以当最优解为 以B1-ε 为代价。选择的(贪婪)解决方案是

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

比最佳效率低几倍。使ε 尽可能少(比如ε = 1e-100),并有一个非常低效的贪婪解决方案。

编辑:仅在整数值的情况下,只需缩放上面的示例:您有一个容量为X 和两个 (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 足够大(比如X = 1e100

【讨论】:

  • 是的,真正的 2 竞争贪心算法需要考虑一个解决方案,该解决方案仅由具有分数设置的项目组成。
  • 好的,谢谢!我明白,它也适用于整数。谢谢你的好例子!
  • @Dmitry Bychenko:非常简洁的答案!
  • @Aleksandr Tukallo:不客气!即使只有一个项目(即B)无法拆分,您也可以创建一个具有任意低效率的反例。即使B 可以拆分但不能拆分为足够小的块(我们不能将金原子拆分为金质子和中子),您也可以创建反例
  • 可能相关,但答案远不简洁:stackoverflow.com/questions/35967159/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2017-10-09
  • 2019-03-31
相关资源
最近更新 更多