dp基礎之計數型硬幣問題

2021-08-31 03:40:12 字數 801 閱讀 7699

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和可以使用的各種面值的硬...