python動態規劃實現硬幣求解問題

2021-10-11 06:06:43 字數 1007 閱讀 7934

動態規劃策略通常用於求解最優化問題,在這類問題中,可能會有許多行解,每乙個解都對應乙個值,我們希望找到具有最優值的那個解。

動態規劃原理:動態規劃演算法將待求解問題拆分成一系列相互交疊的子問題,通過遞推關係定義各子問題的求解策略,並隨時記錄子問題的解,最終獲得原始問題的解,避免了對交疊子問題的重複求解。

動態規劃要領:

動態規劃中有三要素:最優子結構、邊界和狀態轉移函式。

最優子結構:每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到。

邊界:問題最小集的解

狀態轉移函式:從乙個階段向另乙個階段過渡的具體模式,描述的是兩個相鄰子問題之間的關係。

演算法思想

假如要計算11元需要的面值數最小,那麼,11元減去一張1元或者3元或者5元,即10元,8元,6元分別需要的面值數,取出最小,加上1,即可以得到11元最小的。所以,n元最小問題,是由n-1元,n-3元,n-5元三種狀態裡面取到的最優解。其中計算的遞迴樹為:d(11) = min + 1遞推式d(i) = min + 1,其中v為面值1,3,5;i為求值。

**實現

def dynamic(amount):

num=[1,3,5]

#設定乙個字典儲存

dict=

for i in range(1,amount+1):

#硬幣個數肯定不會大於錢數,我們設定為amount+1,如果後期沒有匹配則值還為amount+1,比較好判斷

dict[i] = amount+1

for j in num:

if j <= i:

#最優子結構 狀態轉移方程 邊界

dict[i] = min(dict[i-1]+1, dict[i - j] + 1)

if dict[amount] == amount+1:

return -1

else:

print(dict)

print(dict[amount])

dynamic(6)

動態規劃問題 硬幣問題 Python實現

有面值分別為1,3,5的三種硬幣若干,需要湊成11元最少需要多少硬幣,湊成n元最少需要多少硬幣?動態規劃演算法 最優子結構 邊界 狀態轉移方程 def dynamic amount num 1,3,5 設定乙個字典儲存 dict for i in range 1,amount 1 硬幣個數肯定不會大...

動態規劃 湊硬幣 C 實現

file name dp coin.cpp function 動態規劃 湊硬幣 c 實現 created on 2016年6月28日 author beijiwei qq.com 任何單位和個人不經本人允許不得用於商業用途 有1元,3元,5元面值的硬幣若干枚,求湊齊11元需要的最小硬幣數.inclu...

撿拾硬幣 動態規劃 python

假設有n個硬幣排在一行,要求不能拾取相鄰的兩個硬幣,已獲得累加面值最大的拾取子串行 動態規劃 對於第i個硬幣,1 拾取第i個硬幣,則table i 2 c i 2 不拾取第i個硬幣,則table i 1 取兩者裡邊的最大值給了table i 一直都沒有給列表分配儲存空間的習慣,以為python裡邊不...