有两个众所周知的背包问题:
1)给定n
个项目,每个项目都有weight
和cost
。我们需要选择适合我们背包的物品,并且总和成本最高。可以使用dynamic programming
轻松解决。
2)分数背包:与第一个背包相同,但我们不能只考虑整个项目,而是它的一部分。使用greedy algorithm
可以轻松解决此问题。
想象一下,我们正在使用第二个问题的greedy algorithm
来解决第一个问题。我怎样才能证明,我们得到的解决方案不会比最优解决方案差两倍?
答案 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
)