杆切割算法的混淆 - 动态规划

时间:2014-09-04 13:12:03

标签: algorithm dynamic-programming

我最近看到了一个杆切割问题,其中B(i)=切割长度为i单位的杆的最佳价格,而p(i)=长度为i单位的杆的价格。

给出的算法是这样的: B(i)= max(1 <= k <= i){p(k)+ B(i-k)}

不应该是这样的: B(i)= max(1 <= k <= floor(i / 2)){B(k)+ B(i-k)}
其中B(1)= p(1);

因此,对于一个零件的单个杆和第二个零件的最佳成本,这两个部件都是最优的成本而不是成本。

for example: B(4) = max{ (B(1) + B(3)); (B(2) + B(2)) }

instead of max{ (p(1) + B(3)); (p(2) + B(2)); (p(3) + B(1)) }

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

实际上公式是正确的。你有B(i)= max(1&lt; = k&lt; = i){p(k)+ B(i-k)}。我们假设您有一根长度为i的绳索。如果要剪切它,那么你将剪切一段k,其中k在1i之间,并将继续切割绳索的剩余部分。总的来说,它花费你p(k)(削减你决定不再削减的初始部分的价格)和削减剩余B(i-k)的价格。这正是公式所做的。

您的解决方案也可以完成这项工作,但它有一点点缺点 - 每个子问题的解决方案取决于两个(而不是一个)更简单的子问题的解决方案。我相信因为它平均会表现更差。当然,有一个子问题取决于几个更简单的问题是不被禁止或错误的。

答案 1 :(得分:1)

让我们假设长杆i的最佳价格将通过将杆切割成长度为p的{​​{1}}部分来获得,l1, l2, .., lp和{ {1}}(为简单起见)。

在最佳解决方案中存在长度为i= l1+ l2 +..+ lp的杆件意味着如果长度为l1<l2<l3<…<lp的杆件进一步被分成更小的件,那么长度为{{{ 1}}会减少。因此,对于长度为l1的杆件,我们可以说l1。同样我们已经建立,l1是最优的.................. ..Condition 1

现在考虑长度为l1的杆的情况。声明b[l1] = p[l1]是最佳的。让我们假设情况并非如此。存在b[l2] = p[l2], b[l3]= p[l3], ….., b[lp]= p[lp]. => b(i) = b(l1) + b(l2) +..+ b(lp)使得l1+l2是最佳的。这意味着存在长度为b(l1+l2) = b(l1) + b(l2)L的杆,以便:

  • b(l1+l2) = b(L) + b(l1+l2-L)
  • =&GT; L
  • =&GT;这是一个矛盾{见条件1}
  • =&GT; (l1+l2-L)是最佳的
  • =&GT;同样地,b(L) + b(l1+l2-L)>b(l1)+b(l2).是最佳的,依此类推。

现在我们有一个重复b(l1) + b(l2) + b(l3) +..+ b(lp) < b(L) + b(l1+l2-L) +b(l3) +…+ b(lp)

  • b(l1+l2) = b(l1) + b(l2)
  • b(l2+l3+l4) = b(l2) + b(l3) + b(l4)
    • b(i) = b(k) + b(i-k) for 1<=k<i
    • k=l1, b(i) = b(l1) + b(i-l1) = p[l1] + b(i-l1)
    • k=l1+l2, b(i) = b(l1+l2) + b(i-l1-l2)
    • = b(l1+l2) + b(l3 + l4 +…+lp)
    • = [b(l1) + b(l2)] + b(l3 + l4 +…+lp)
    • = b(l1) + [b(l2) + b(l3 + l4 +…+lp)]
  • = b(l1) + b(l2+l3+l4+…+lp) = b(l1) + b(i-l1)

总而言之,如果我们想要找到长度为= p[l1] + b(i-l1)的杆的最佳解,我们会尝试将长度为k= l1+l2, b(i) = p[k’] + b(i-k’)的杆分成长度为k’=l1的两部分{ {1}}然后我们递归地找到两个杆件的最佳解,我们最终找到一个长度i的最佳杆件和长度为i的杆的最佳解。因此我们可以说:

(l1+l2)

答案 2 :(得分:1)

公式正确。我认为,当我们认为两个公式都可以替代另一个公式时,就会引起混淆。
尽管他们计数相同的现象,但是可以通过两种不同的方式完成:

让,B(i)=切割长度为i单位的棒的最佳价格, p(i)=长度为i单位的棒的价格。

公式1:B(i)= max(1 <= k <= floor(i / 2)){B(k)+ B(i-k)}和P(i)

公式2:B(i)= max(1 <= k <= i){p(k)+ B(i-k)})

考虑一根长度为4的杆 可以通过以下方式削减它:

1)长度为4的未切割

2)3,1

3)2、2

4)2、1、1

5)1、3

6)1、2、1

7)1、1、2

8)1,1,1,1

根据公式1:

选项1对应于P(4)

选项2,5,6,7,8对应于B(1)+ B(3)

选项3,4,6,7,8对应于B(2)+ B(2)

根据公式2:

选项1对应于P(4)

选项2对应于P(3)+ B(1)

选项3,4对应于P(2)+ B(2)

选项5,6,7,8对应于P(1)+ B(3)

因此,可以得出结论,1和2在计算最佳解决方案,但是以不同的方式,与1相比,2更紧凑,递归调用更少。