dp基礎之計數型硬幣問題
阿新 • • 發佈:2018-11-19
解決DP問題的四大步驟:
1.確定狀態:研究最有策略的最後一步,轉化為子問題 ,重點
2.轉移方程:根據子問題定義直接得到轉移方程,男點
3.初始條件和邊界情況:注意點
4.計算順序:最好能利用之前計算好的結果,省得重複計算,技巧點
問題:現有2,5,7三種硬幣足夠數量,要拼湊成m元錢,求使用最少硬幣數。
代買及註釋如下:
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]] <sys.maxsize表示可以找到湊成i-coins[j]所需最少的硬幣數 # f[i-coins[j]]+1<f[i]表示若使用coins[j]硬種可以達到問題要求, #則更新f[i] if i>=coins[j] and f[i-coins[j]] <sys.maxsize and f[i-coins[j]]+1<f[i]: f[i] = f[i-coins[j]]+1 if f[M]<sys.maxsize: return f[M] else: return -1 #測試 coins = [2,5,7] M=27 print(get_num(coins,M)) 輸出結果為5,正確