演算法導論15 1鋼條切割 練習總結

2021-07-09 17:33:39 字數 1835 閱讀 5113

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...