1. 程式人生 > 實用技巧 >演算法導論:鋼條切割

演算法導論:鋼條切割

《演算法導論》第十五章 動態規劃首先討論了鋼條切割問題,下面做個簡單的總結:

一、遞迴

# 價格陣列
Ap=[0,1,5,8,9,10,17,17,20,24,30]
def cutrod(n):
    if n==0:
        return 0
    m = -1
    for i in range(1,n+1):
        t = cutrod(n-i)
        r = Ap[i] + t
        m = max(m,r)
    return m

從函式執行角度看,這個遞迴過程是一個純函式,未產生任何副作用,從而影響到函式呼叫棧的上一層。

從問題角度看,則是拆解後的子問題,不依賴以任何原問題的資訊。

二、動態規劃(記憶陣列)

# 收益
Mr = {}
# 第一段切割長度
Ms = {}
def cutrod_memo(n):
    if n==0:
        return 0
    if n in Mr.keys():
        return Mr[n]
    m = -1
    s = -1
    for i in range(1,n+1):
        t = cutrod_memo(n-i)
        r = Ap[i] + t
        if r>m:
            m = r
            s = i
    if n not
in Mr.keys(): Mr[n]=m Ms[n]=s return m def main(): l = 9 r1 = cutrod(l) print("最大收益: ") print(r1) r2 = cutrod_memo(l) print("最大收益: ") print(r2) print("收益:") print(Mr) print("第一段的切割長度: ") print(Ms) if __name__ == "__main__": main()

  遞迴過程中實際上建立了一顆遞迴呼叫樹,通過儲存子問題的答案,避免重複求解相同的子問題的答案。隨後如果出現相同的子問題,則通過檢索獲取答案。從而將一個指數時間的求解過程,轉化為多項式時間的查表過程。