15.1-1 由公式(15.3)和初始條件t(0) = 1,證明公式(15.4)成立。
15.1-2 舉反例證明下面的「貪心」策略不能保證總是得到最優切割方案。定義長度為i的鋼條的密度為pi / i,即每英吋的價值。貪心策略將長度為n的鋼條切割下長度為i (1 ≤ i ≤ n)的一段,其密度最高。接下來繼續使用相同的策略切割長度為n-i的剩餘部分。
answer:當長度n = 4時,按照「貪心」策略則切割成長度為1和3的鋼條(p = 1 + 8 = 9);而最優解為切割成2條長度為2的鋼條(p = 5 + 5 = 10 > 9)。
15.1-3 我們對鋼條切割問題進行一點修改,除了切割下的鋼條段具有不同價值pi外,每次切割還要付出固定的成本c。這樣,切割方案的收益就等於鋼條段的**之和減去切割成本。設計乙個動態規劃演算法解決修改後的鋼條切割問題。
answer:多新建乙個陣列m[0...n]記錄每個長度的鋼條最優解的切割段數,當完成長度為i的鋼條最優解時,更新長度為i+1時使m[i+1] = m[j] + 1,其中長度為i+1的鋼條切割成長度為(i+1-j)和j的兩大段,長度為j的鋼條繼續切割。
bottom_up_cut_rod_cost(p, n, c):
let r[0...n] and m[0...n] be new arrays
r[0] = 0, m[0] = 0
for i = 1 to n
q = -∞
for j = 1 to i
if q < p[j] + r[i-j] - m[i-j]*c
q = p[j] + r[i-j] - m[i-j]*c
m[i] = m[i-j] + 1
r[i] = q
return r[n]
15.1-4 修改memoized-cut-rod,使之不進返回最優收乙隻,還返回切割方案。answer:利用陣列s的結果可以得到切割方案,新建儲存長度為n的鋼條切割方案陣列t[0...n]
cut_way(s, n):
i = 0
while n > 0
t[i] = s[n]
n = n - s[n]
i = i + 1
return t[0...i-1]
15.1-5 斐波那契數列可以用遞迴式(3.22)定義。設計乙個o(n)時間的動態規劃演算法計算第n個斐波那契數。畫出字問題圖。圖中有多少頂點和邊?answer:o(n)時間,o(1)空間
on_for_fibonacci_sequence(n):
if n <= 2
return 1
x = 1, y = 1
for i = 3 to n
res = x + y
x = y
y = res
return res
子問題圖:
圖中有n個頂點,(2n-3)條邊。
鋼條切割 演算法導論
給定長度任意長度的鋼條的價值,求解如何切割,使給定長度為n的鋼條的價值最大。對於長度為n的鋼條,考慮子問題,我們遍歷1 n的第乙個切割的位置j,即得到長度為j和n j的兩段鋼條,第一段不再切割,僅對第二段繼續切割,遞迴求解,於是就得到了乙個遞迴解法。這裡是c語言實現 define crt secur...
15 1 鋼條切割 動態規劃
問題 給定一段長度為n英吋的鋼條和乙個 表,求切割鋼條方案,使收益最大 切割本身沒有成本 解法一 帶備忘錄的自頂向下法 帶備忘錄的自頂向下法 param p 長度為i的鋼條的收益為p i param n 待切割的鋼條的長度 public static intmemoizedcutrod int p,...
動態規劃 鋼條切割《演算法導論》
給定各長度鋼鐵單位 以及乙個長度為n的鋼條,求最大效益 1 10 分別為p include includeint memorized cut rod aux int p,int len,int r 樸素遞迴演算法 演算法複雜度為2 n級這裡寫 int cut rod int p,int len in...