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