因此,对于练习题,我们应该设计一个动态编程算法,这是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
...
你能帮助我解决这个问题并设计复发方程吗?
答案 0 :(得分:8)
我们有4n个元素。
<强>符号:强>
V[k]
- 元素k的值(1 <= k <= 4n)W[k]
- 元素k的权重(1 <= k <= 4n)B
- 绑定f(k,B)
- 当边界为B并且您有4k个元素时,最优解的值。对于第k个元素,我们有五种可能的选择:
f(k-1,B)
。为什么?因为我们有k-1个元素,而界限仍然是B。V[k] + f(k-1, B - W[k])
。为什么?我们为第k个元素赢得了V [k]并且W [k]。所以对于剩下的元素,我们将获得f(k-1,B - W [k])。V[k+n] + f(k-1, B - W[k+n])
。V[k+2n] + f(k-1, B - W[k+2n])
。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
}
还有什么可以找到初始条件。
答案 1 :(得分:3)
标准0/1背包问题:对于每件物品,要么你不服用,要么你不服用。
您的问题:对于每件商品,要么您不接受它,要么从源1或......中取出,或者从源4获取它。
现在看一下0/1背包问题的常用动态编程算法和递归关系。看一下递归关系中RHS的每个位来自何处;它对应于上面的第一个陈述。适应使用上面的第二个陈述。
(如果我有点神秘,那是因为这是家庭作业,你的意思是学习: - )。)