3 遞迴(動態規劃思想)

2022-07-25 22:09:12 字數 2243 閱讀 6477

# -*- coding:utf-8 -*-

#@time : 2020/5/2 11:06

#@author: aluosen

#@file : recurrence.py

##進製轉換

def tostr(n,base):

convertstring = '0123456789abcdef'

if n < base:

return convertstring[n]

else:

return tostr(n//base,base) + convertstring[n%base]

print(tostr(65536,16))

#漢諾塔問題

#零錢兌換問題-1、遞迴解法

def recmc(coinvaluelist,change):

mincoins = change

if change in coinvaluelist: #最小規模

return 1

else:

for i in [c for c in coinvaluelist if c <= change]: #呼叫自身

numcoins = 1 + recmc(coinvaluelist, change - i) #減小規模

if numcoins < mincoins:

mincoins = numcoins

return mincoins

#零錢兌換問題-2、遞迴解法改進(增加了最優解表,中間結果記錄)

def recmc(coinvaluelist,change,knownresults):

mincoins = change

if change in coinvaluelist: #最小規模,遞迴基本結束

knownresults[change] = 1 #記錄最優解

return 1

elif knownresults[change] > 0:

return knownresults[change] #查表成功

else:

for i in [c for c in coinvaluelist if c <= change]: #呼叫自身

numcoins = 1 + recmc(coinvaluelist, change - i,knownresults) #減小規模

if numcoins < mincoins:

mincoins = numcoins

#找到最優解,記錄到表中

knownresults[change] = mincoins

return mincoins

#零錢兌換問題-3、動態規劃演算法

def dpmakechange(coinvaluelist, change, mincoins):

for cents in range(1, change + 1):

coincount = cents

for j in [c for c in coinvaluelist if c <= cents]:

if mincoins[cents -j] + 1 < coincount:

coincount = mincoins[cents -j] +1

mincoins[cents] = coincount

return mincoins[change]

動態規劃 思想

動態規劃 把問題劃分成子問題遞迴求解,並且保留中間結果以避免重複計算子問題的方法,叫動態規劃。eg 三角形路徑數字之和 關鍵思想 1,劃分成若干子問題 2,子問題的狀態,及若干狀態值 狀態的表述。3,子狀態之間的轉換 即遞迴求解,子狀態到上一級子狀態之間的變換關係 即如何從乙個或多個值已知的狀態,求...

動態規劃思想

1 解決問題 分治 用有限的計算能力處理大規模問題的基本手段 1.1 遞迴 問題的解決方法包含遞迴部分和非遞迴部分,非遞迴部分解決問題的一部分,減少問題規模,而遞迴部分將形式不變,但減小了規模的問題傳遞到下一輪解決中去。這樣,每一輪處理,問題都有一部分 規模 得到解決,一直遞迴下去 直到終止條件 直...

動態規劃的思想

動態規劃 dynamic programming 演算法是解決多階段決策過程最優化問題的一種常用方法,難度比較大,技巧性也很強。利用動態規劃演算法,可以優雅而高效地解決很多貪婪演算法或分治演算法不能解決的問題。動態規劃演算法的基本思想是 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後...