1. 程式人生 > >dp基礎之計數型硬幣問題

dp基礎之計數型硬幣問題

解決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,正確