ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

动态编程:杆切割问题

前开发者教程 2020年3月29日

在本教程中,我们将学习杆切割问题。

 

问题陈述:

您获得了长度为n的鱼竿,并且需要以某种方式切割鳕鱼,以便将其出售以获取最大利润。您还会得到一张价格表,其中给出了一根杆的价值。

 

例

动态编程:杆切割问题

 

因此,根据上表,如果您切割长度为1的杆,则可以看到2 rs。

同样,如果您将棒切成2号长度,则可以7 rs的价格出售

同样,如果您将棒切成3长度,则可以10 rs的价格出售

 

根据问题,您需要找到如何切割杆的方法,以便获得最大的利润。

 

在我们的示例中,杆的长度为5。

 

如果您不剪掉整个杆,则利润为12 rs。

 

但是,如果您在长度3和长度2处切割杆,则总利润将为7 + 10 =17。这使我们获得了最大利润。

 

那么,如何解决这个问题呢?

 

一种方法是使用蛮力方法。在蛮力法中,对于长度n = 4,我们得到以下组合。

 

1 1 1 1

1 1 2

1 2 1

2 1 1

3 1

2 2

1 3

4

 

从上面我们总共有8种不同的方法来切割长度为4的杆。然后,我们需要找到所有组合的利润并找到其中的最大值。然后我们得出结果。

 

但这将需要2 ^ n-1,即2 ^ 4-1 = 2 ^ 3 = 8种不同的方式。

因此,最坏情况下的时间复杂度将为O(2 ^ n-1)。

 

如果使用DP,我们可以将时间复杂度降低到O(n ^ 2)。

 

让我们看看如何将DP应用于我们的问题。

 

通常,对于DP,我们需要一个DP矩阵。初始矩阵如下:

动态编程:杆切割问题

 

在该行上,我们将具有杆的长度。在该列上,我们将具有可出售的长度件数。

 

在表中,我们将填写利润。最后,我们将获得最大的利润。

 

当标尺长度为0时,利润也将为0。

因此,我们可以首先填充矩阵,如下所示:

动态编程:杆切割问题

 

从“ 0”开始每个DP矩阵很重要,这样您在解决子问题时会很清楚。

 

转到下一行。 “第1行”。我们有长度为1的杆件,因此对于每个不同的长度,我们需要使用杆件1的组合并计算利润。

 

对于长度1,利润将为2。

对于长度2,利润将为4。

对于长度3,利润将为6。

对于长度4,利润将是8。

对于长度5,利润将是10。

 

因此,更新后的矩阵将如下所示:

动态编程:杆切割问题

 

现在,对于下一行,我们具有[1、2]的杆件组合。现在我们将如下填充数组。

 

长度为1时,您只能使用1个长度。因此利润为2。

在长度2处,您可以有2个选择。您可以使用长度为1的杆两次或长度为2的杆一次。当我们确定最大利润时,我们将计算两种情况下的利润。

 

即

1件+ 1件= 2 + 2 = 4

杆的长度2 = 7。

由于需要最大值,因此我们选择7。

 

同样,对于长度3,我们可以将杆切成1长度&2个长度。因此利润是2 + 7 = 9

同样,对于长度4,我们可以将杆切割2个长度&2个长度。因此利润是7 + 7 = 14

同样,对于长度5,我们可以将棒切成2长度& 2 lengths &1个长度。因此利润是7 + 7 + 2 = 16

 

因此,我们更新的DP表如下:

动态编程:杆切割问题

 

同样,我们将在下一行中查找。在下一行中,我们可以选择长度为[1、2、3]的杆。

 

对于长度1,利润为2。

 

对于长度2,利润为7。我们从上方获取这两个值。

 

对于长度3,我们可以将棒切成2长度&1个长度。因此,利润为9,或者我们可以卖出长度为3的整个杆以获取利润10。我们选择最大利润,即10。

 

对于长度4,我们可以将杆切割2个长度&2个长度。因此利润是14或我们可以切割长度3的杆&1个利润长度12。我们选择最大利润,即14。

 

对于长度5,我们可以将杆切成3长度&2个长度。因此利润为17。

 

更新后的DP表如下:

动态编程:杆切割问题

 

通过查看上表,我们可以得出DP公式?是的,我们可以这样做,如下所示:

 

对于i = 1到n

对于j = 1到n

如果我< j

dp [i] [j] = dp [i-1] [j]

其他

dp [i] [j] = max(dp [i-1] [j],arr [i] + dp [i] [j-1])

同样,我们将求解矩阵。

最终矩阵如下:

动态编程:杆切割问题

 

因此,结果。

 

C ++解决方案

#include<iostream> 
using namespace std; 
  
int get_max(int a, int b) { return (a > b)? a : b;} 
  

int rod_cutting_dp_solution(int price[], int n) 
{ 
   int dp_table[n+1]; 
   dp_table[0] = 0; 
   int i, j; 
  

   for (i = 1; i<=n; i++) 
   { 
       int max_val = INT_MIN; 
       for (j = 0; j < i; j++) 
         max_val = get_max(max_val, price[j] + dp_table[i-j-1]); 
       dp_table[i] = max_val; 
   } 
  
   return dp_table[n]; 
} 
  
int main() 
{ 
    int arr[] = {2, 7, 10, 11, 12}; 
    int size = sizeof(arr)/sizeof(arr[0]); 
    cout<<"Maximum Value is "<< rod_cutting_dp_solution(arr, size)<<endl; 
    return 0; 
} 

// Maximum Value is 17

 

该网站上可用的教程列表:

C编程20+章C ++编程80+章
100多个编码问题数据结构和算法85+章
系统设计20+章Shell脚本编写12章
4g LTE 60+章节最常见的编码问题
5G NR 50+章Linux系统编程20+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权© 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的
    • <abbr id="QPg1I5c" class="QjY6zz1"><ruby id="XgK07VV" class="XblgsDL"><details class="Pg8HMQM"><u id="XckhuMK"></u></details></ruby></abbr>


      <hr id="bIyzZKy" class="bwJiogF"><strike id="QIm8kti" class="QvRfufu"></strike></hr>

      <aside class="T40zwVx"><tfoot class="muNV8tz"><hgroup id="oC5EMSF" class="okZntMj"><small class="LHO386u"></small></hgroup></tfoot></aside>

      • <base id="ryOv97J" class="rIyNDvQ"><applet id="TX0zrX5"><code id="cSYeogz" class="ckajOO2"><kbd class="CfXLAQz"></kbd></code></applet></base>
        <canvas id="bZbXyBQ" class="bi4cRNI"><rt id="YvcJbV8" class="Yu2PfBC"></rt></canvas>
        <tbody id="j6jiHiq"><big id="PGzNDY6"></big></tbody>