用动态规划求解分数背包问题
Posted
技术标签:
【中文标题】用动态规划求解分数背包问题【英文标题】:Solving fractional knapsack problem with dynamic programming 【发布时间】:2020-06-04 17:12:17 【问题描述】:前几天,我在阅读关于分数背包问题的贪心算法和动态规划的文章,我看到这个问题可以用贪心方法最优地解决。谁能给出一个例子或解决方案来用动态规划方法解决这个问题?
P.S:我知道贪心法是解决这个问题的最好方法,但我想知道动态规划是如何解决这个问题的。
【问题讨论】:
【参考方案1】:是的,你可以用动态规划解决这个问题。
让f(i, j)
表示使用容量为j
的背包使用第一个i
元素可以获得的最大总值。
如果您熟悉 0-1 背包问题,那么您可能还记得我们有完全相同的功能。但是,0-1 背包问题的重现是f(i, j) = maxf(i - 1, j), V[i] + f(i - 1, j - W[i])
(第一个参数考虑了我们不使用索引i
的项目的情况,第二个参数考虑了我们确实使用了索引处的项目i
)。
在分数背包问题中,我们被允许携带分数数量的物品。因此,我们的重复出现类似于f(i, j) = maxf(i - 1, j), delta * V[i] f(i - 1, j - delta * W[i])
在所有可能的delta
值上,其中delta
表示我们正在服用的物品的数量。
现在如果你以足够小的增量增加delta
,你应该得到正确的答案。
【讨论】:
if you increment delta in sufficiently small increments, you should get the correct answer
所以它恢复到多参数优化问题,看起来不适合动态编程方法;-)以上是关于用动态规划求解分数背包问题的主要内容,如果未能解决你的问题,请参考以下文章