解决 0/1 背包的变化(物品的多个来源,每个物品都可以从一个来源中选择)
Posted
技术标签:
【中文标题】解决 0/1 背包的变化(物品的多个来源,每个物品都可以从一个来源中选择)【英文标题】:Solving a variation of 0/1 Knapsack (multiple source for items, each item can be selected from one of the sources) 【发布时间】:2011-03-20 21:28:07 【问题描述】:所以对于一个练习题,我们应该设计一个动态规划算法,它是 0/1 背包问题的变体......基本上每个项目都来自 4 个不同的来源,并且该项目只能取自一个来源..
即,
S1=(d_k, b_k) | 1 ≤ k ≤ n,
S2=(d_k, b_k) | n + 1 ≤ k ≤ 2n,
S3=(d_k, b_k) | 2n + 1 ≤ k ≤ 3n,
S4 = (d_k, b_k) | 3n + 1 ≤ k ≤ 4n
对于n = 10
,如果你选择i = 16
放,那意味着你不会选择6, 26 or 36
...
你能帮我解决这个问题并设计递归方程吗?
【问题讨论】:
【参考方案1】:我们有 4n 个元素。
符号:
V[k]
- 元素 k 的值 (1
W[k]
- 元素 k 的权重 (1
B
- 绑定
f(k,B)
- 边界为 B 且您有 4k 个元素时的最优解的值。
对于第 k 个元素,我们有五种可能的选择:
-
未将第 k 个元素插入背包。在该约束下,最优解的值为
f(k-1,B)
。为什么?因为我们还有 k-1 个元素,但边界仍然是 B。
从 S1 中获取第 k 个元素。在该约束下,最优解的值为V[k] + f(k-1, B - W[k])
。为什么?我们已经为第 k 个元素赢得了 V[k] 和腰围 W[k]。因此,对于其余元素,我们将获得 f(k-1, B - W[k])。
从 S2 中获取第 k 个元素。使用与之前相同的逻辑,可以看出该约束下最优解的值为V[k+n] + f(k-1, B - W[k+n])
。
从 S3 中获取第 n 个元素。最佳:V[k+2n] + f(k-1, B - W[k+2n])
。
从 S4 中获取第 n 个元素。最佳:V[k+3n] + f(k-1, B - W[k+3n])
。
你的目标是最大化 f。因此递归方程为:
f(k, B) =
max
f(k-1,B), //you don't take item n
V[k] + f(k-1, B - W[k]), //you take item k from S1
V[k+n] + f(k-1, B - W[k+n]), //you take item k from S2
V[k+2n] + f(k-1, B - W[k+2n]), //you take item k from S3
V[k+3n] + f(k-1, B - W[k+3n]) //you take item k from S2
剩下的就是找到初始条件了。
【讨论】:
这是一个非常好的明确答案,但在我看来,仅仅为他(或她)做 Wonder 的家庭作业太过分了。顺便说一句,您有一个错误:您使用 n 来表示“我们正在考虑添加的项目的数量”和“项目的总数”。调用前一个k,比如你的“3n”应该是“k+2n”等等 @Gareth:感谢您找到我的错误。我已经编辑了我的答案并修复了它。关于解决Wonder的作业:我确实透露了困难部分的最终答案,但只是在充分解释了其背后的逻辑之后。他可以在不阅读我答案的最后一部分的情况下提出解决方案。不过,我认为给他最终的答案是可以的,这样他就可以确保他做对了。我相信他确实花时间思考,而且他不只是复制解决方案。【参考方案2】:标准0/1背包问题:对于每件物品,要么你不带,要么你带。
你的问题:对于每个项目,要么你不接受它,要么你从源 1 中获取它,或者......,或者你从源 4 中获取它。
现在看一下 0/1 背包问题的常用动态规划算法和递归关系。看递归关系中RHS的每一位是从哪里来的;它对应于上面的第一个语句。改用上面的第二条语句。
(如果我有点神秘,那是因为这是家庭作业,你应该学习 :-)。)
【讨论】:
是的,感谢您的回复。是的,我应该从中学习:) 那么我建议你忽略snakile的(优秀)答案,除非你真的卡住了。 :-)以上是关于解决 0/1 背包的变化(物品的多个来源,每个物品都可以从一个来源中选择)的主要内容,如果未能解决你的问题,请参考以下文章