鋼條切割問題
serling公司購買長鋼條,將其切割為短鋼條**。切割工序本身沒有成本支出。公司管理層希望知道最佳的切割方案。假定我們知道serling公司**一段長為i英吋的鋼條的**為pi(i=1,2,…,單位為美元)。鋼條的長度均為整英吋。圖15-1給出了乙個**表的樣例。
鋼條切割問題是這樣的:給定一段長度為n英吋的鋼條和乙個**表pi(i=1,2,…n),求切割鋼條方案,使得銷售收益rn最大。注意,如果長度為n英吋的鋼條的**pn足夠大,最優解可能就是完全不需要切割。
//鋼條切割問題
#include
#include
#include
using
namespace std;
int* record;
//記錄陣列,避免重複子問題的多次計算
int* steel;
//鋼條**表,下標對應鋼條長度
int steel_len;
//鋼條原始長度,也是鋼條種類的數量
//直接遞迴,效能很差,因為有很多的重複子問題多次計算
intdfs
(int len)
return max_value;
}//記憶型遞迴,解決了重複子問題多次計算
intdfs_2
(int len)
//確定首段長度,剩下的遞迴
for(
int first_len =
1; first_len <= len -
1; first_len++
)//計算後儲存
record[len]
= max_value;
return max_value;
}//動規解法
intdp
(int len)
}return arr_dp[len];}
intmain()
record =
newint
[steel_len +1]
;memset
(record,-1
,(steel_len +1)
*sizeof
(int))
; cout <<
dfs(steel_len)
<< endl;
cout <<
dfs_2
(steel_len)
<< endl;
cout <<
dp(steel_len)
<< endl;
return0;
}/*測試用例:
101 5 8 16 10 17 17 20 24 30
*/
演算法學習(動態規劃 一)鋼條切割
給定一段長度為n的鋼條和乙個 表,求切割鋼條方案,使得銷售收益最大 表 長度i123 4567 8910 p15 891017 1720 2430 經過分析,因為在距離鋼條左端i i 1,2,3 n 處,總是可以選擇切割或者不切割,因此可得,其共有2n 1種切割方案,以下是使用自頂向下遞迴實現的 該...
鋼條切割 演算法導論
給定長度任意長度的鋼條的價值,求解如何切割,使給定長度為n的鋼條的價值最大。對於長度為n的鋼條,考慮子問題,我們遍歷1 n的第乙個切割的位置j,即得到長度為j和n j的兩段鋼條,第一段不再切割,僅對第二段繼續切割,遞迴求解,於是就得到了乙個遞迴解法。這裡是c語言實現 define crt secur...
鋼條切割問題
動態規劃的一般步驟 1.刻畫乙個最優解的結構特徵 2.遞迴定義最優解的值 3.計算最優解的值,通常採用自底向上的方法 4.利用計算出的資訊構造乙個最優解 利用動態規劃方法求解類似鋼條切割方案的這一類遞迴問題,可避免反覆求解相同的子結構,下面是樸素遞迴演算法和用動態規劃設計的遞迴演算法的相應實現。鋼條...