【问题标题】:Algorithm for cutting rod to maximize profit切杆算法实现利润最大化
【发布时间】:2016-03-26 23:46:12
【问题描述】:

我正在尝试通过动态编程解决标准的切杆问题。如发现herehere,递归关系似乎是:

prices = [1..n]
array[1..n]

array[1] = prices[1]

for i in (2..n)
{
    array[i] = INT_MIN
    for j in (1..i-1)
    {
        array[i] = max(array[i],prices[j]+array[i-j])
    }
}

array[n] 返回n 的值,这就是我们的答案。我的问题就在这条线上

array[i] = max(array[i],prices[j]+array[i-j])

不应该

array[i] = max(array[i],array[j]+array[i-j])

假设我们正在尝试找到长度 8 的最大值。现在,对于4,我们发现我们通过切割单个长度单位4获得的值小于通过切割31的长度获得的值,即对于n = 4prices[4]是不是最优的。但由于我们是自下而上构建结果数组,array[4] 是最优的。那么与prices[4]+array[4] 相比,array[4]+array[4] 不是n = 8 的最大值吗?我得到的解决方案如下所示:

prices = [1..n]
array[1..n]

for i in (1..n)
    array[i] = prices[i] //prices[i] is the minimum value we can obtain by cutting it fully 

for i in (2..n)
{
    for j in (1..i-1)
    {
        array[i] = max(array[i],array[j]+array[i-j]) // find out all possible (j,i-j) pairs, and compare with array[i]
    }
}

如果这不正确,请告诉我我在逻辑上犯了什么错误。

【问题讨论】:

  • 你能在这里描述一下这个问题吗?究竟是什么切杆问题。

标签: arrays algorithm dynamic-programming


【解决方案1】:

array[i] = max(array[i],prices[j]+array[i-j]) 在我看来很合适。

在该算法中,j 表示初始切割的杆长度。我们从长度为i 的杆开始并切断j。然后,我们需要知道i - j 的杆可以得到多少,因为您只需切断j 的长度,就剩下i - j。但我们知道这个价值至少和price[i-j] 一样高,因为我们可以选择将鱼竿整体出售或通过切割来增加其价值。

示例: 我们有一个长度为 4 的棒。假设 array[] 已经包含 1,2,3 的最佳值,那么我们:

剪下长度为 1 的一段,然后检查我们可以得到多少长度为 3 的杆

剪下一段长度为2的,然后看看我们能得到多少 对于长度为 2 的杆

剪下长度为 3 的一段,然后检查我们可以得到多少长度为 1 的杆

然后选择最大值。

如果我们使用array[i] = max(array[i],array[j]+array[i-j])

array[k] 包含长度为 k 的杆的最大值,如果我们将其切成碎片。因此,与我们使用 price[k] 相比,这些值会出乎意料地高。

此外,递归中的当前步骤只关心进行一次切割,并检查剩余的最大值,而不是两侧的最大值(当您发现大切割的值可能不理想时,将予以处理)

【讨论】:

  • 对不起,我没有收到这条线 - array[k] contains the maximum value for a rod of length k if we cut it into pieces. So these values would be unexpectedly high compared to if we used price[k].。你能再解释一下吗?
  • 当然 - Price[k] 是长度为 k 的杆的价值,作为一个整体。所以 array[k] 必须至少有那么高,因为我们可以选择将它作为一个整体出售(以 price[k] 为单位)如果我们可以将其切成碎片,则可能会以更高的价格出售其值加起来大于 price[k]。此外,如果我们从不参考价格数组,那么任何棒的价值将始终是价格[1] * 长度
  • 嗯,就是这样,对吧?当我试图为n=8 获得最佳剪辑时,我只需要知道可以产生它的最佳组合。如果array[4] 大于prices[4],那么显然prices[4]+prices[4] 将小于array[4]+array[4],不是吗?为什么我需要咨询prices[4],因为对于n=4,我已经在array[4] 中存储了最佳解决方案? array[4]的初始值已经是prices[4],所以当array[4]的最终值更新时,它会考虑到独立剪切以及子组合并选择最好的,对吧?
  • 如果将 array[] 初始化为 price[] 的值,那么我不明白为什么第二次重复不起作用。如果不初始化你的数组,虽然它肯定是行不通的。
  • 啊哈,我在代码的第 3 行和第 4 行的问题中明确提到了它.. :)
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多