鋼條切割(動態規劃)

2022-08-24 04:57:11 字數 1320 閱讀 9412

演算法導論第15章:

假設公司**一段長度為i英吋的鋼條的**為pi(i = 1, 2, ...單位:美元),下面給出了**錶樣例:

長度i     1     2     3 

4  5   6     7  8   9  10

**pi  1     5     8 

9  10   17   17  20   24  30

切割鋼條的問題是這樣的:給定一段長度為n英吋的鋼條和乙個**表pi,求切割方案,使得銷售收益rn最大。

當然,如果長度為n英吋的鋼條**pn足夠大,最優解可能就是完全不需要切割。

對於上述**錶樣例,我們可以觀察所有最優收益值ri及對應的最優解方案:

r1 = 1,切割方案1 = 1(無切割)

r2 = 5,切割方案2 = 2(無切割)

r3 = 8, 切割方案3 = 3(無切割)

r4 = 10, 切割方案4 = 2 + 2

r5 = 13, 切割方案5 = 2 + 3

r6 = 17, 切割方案6 = 6(無切割)

r7 = 18, 切割方案7 = 1 + 6或7 = 2 + 2 + 3

r8 = 22, 切割方案8 = 2 + 6

r9 = 25, 切割方案9 = 3 + 6

r10 = 30,切割方案10 = 10(無切割)

更一般地,對於rn(n >= 1),我們可以用更短的鋼條的最優切割收益來描述它:

rn = max(pn, r1 + rn-1, r2 + rn-2,...,rn-1 + r1)

首先將鋼條切割為長度為i和n - i兩段,接著求解這兩段的最優切割收益ri和rn - i

(每種方案的最優收益為兩段的最優收益之和),由於無法預知哪種方案會獲得最優收益,

我們必須考察所有可能的i,選取其中收益最大者。如果直接**原鋼條會獲得最大收益,

我們當然可以選擇不做任何切割。

分析到這裡,假設現在**8英吋的鋼條,應該怎麼切割呢?

1 #include 2

using

namespace

std;

3#define inf (1<<30)

4const

int n=10000;5

intr[n];

6int p[11]= ;

7int max(int a,intb)8

12int

get(int

n)13

22 r[j]=q;23}

24return

r[n];25}

26int

main()

27

動態規劃 鋼條切割

一家公司購買長鋼條,將其切割成短鋼條 切割本身沒有成本,長度為i的短鋼條的 為pi。那給定一段長度為n的鋼條和乙個 表pi,求鋼條的切割方案使得收益rn最大。如乙個pi如下 長度i12 3456 78910 pi15 891017 1720 2430 在距離鋼條左端i長度處,我們總是可以選擇切割或者...

動態規劃 鋼條切割

這是演算法導論動態規劃的乙個例子,自己實現了一下 給定乙個長度為n英吋的鋼條和乙個 表pi i 1,2 n 求切割鋼條方案,使得銷售收益rn最大。注意,如果長度為n的鋼條 pn足夠大,則最優解可能就不需要切割。分析 如下 include include include using namespace...

動態規劃 鋼條切割

動態規劃 dynamic programming 什麼是動態規劃,我們要如何描述它?動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解將由上一次子問題的解推出。動態規劃和分治法相似,都是通過組合子問題的解來求解原問題。分治法將問題劃分成互不相交的子問題,遞迴求解子問題,再將他們的...