1.確定狀態:研究最優策略的最後一步,轉化為子問題 ,重點
2.轉移方程:根據子問題定義直接得到轉移方程,難點
3.初始條件和邊界情況:注意點
4.計算順序:最好能利用之前計算好的結果,省得重複計算,技巧點
代買及注釋如下:
import sys
def get_num(coins,m):
#coins為陣列,是硬幣的種類;m為所要湊的錢數
#返回湊成m塊錢所需要最少的硬幣數,若不能湊成則返回-1
n = len(coins)
#先建立乙個長度為m+1的0列表,m+1是為了儲存湊成從0到m塊錢所需要的最少硬幣數
#f[i]表示湊成i塊錢所需要最少的硬幣數
f =[0]*(m+1)
for i in range(1,m+1):
#邊界條件:f[0] = 0
#還未計算出硬幣數的錢數先設定成無窮大
f[i] = sys.maxsize
for j in range(n):
#i>coins[j]表示保證所要湊成的錢數大於硬幣的面值
#f[i-coins[j]] =coins[j] and f[i-coins[j]] f[i] = f[i-coins[j]]+1
if f[m]return f[m]
else:
return -1
#測試
coins = [2,5,7]
m=27
print(get_num(coins,m))
輸出結果為5,正確
DP 硬幣問題
動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解將由上一次子問題的解推出。使用動態規劃來解題只需要多項式時間複雜度,因此它比回溯法 暴力法等要快許多。動態規劃也是面試筆試題中的乙個考查重點,當閱讀乙個題目並且開始嘗試解決它時,首先看一下它的限制。如果要求在多項式時間內解決,那麼...
硬幣問題(DP)
題目 有n種硬幣,面值分別為v1,v2,vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值!狀態 d i 表示i 元最少要換多少個硬幣,那麼我們便要求d s 的值 狀態如何轉移 i元換零錢v j i v j 後狀態變為 d i v j 狀態選取 選d...
dp 最少硬幣問題
問題描述 設有n 種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣 來找錢。可以使用的各種面值的硬幣個數存於陣列coins 1 n 中。對任意錢數0 m 20001,設計乙個用最少硬幣找錢m的方法。程式設計任務 對於給定的1 n 10,硬幣面值陣列t和可以使用的各種面值的硬...