# 動態規划法求解貨幣兌換問題
# 貨幣系統有 n 種硬幣,面值為 v1,v2,v3...vn,其中 v1=1,使用總值為money的錢與之兌換,求如何使硬幣的數目最少,即 x1,x2,x3...xn 之和最小
# 輸入:各種貨幣的面值 v1,v2,v3...vn;要兌換的總值 money
# 輸出:兌換得到最少的貨幣數量
1 # 修改貨幣系統的面額 2 v = [1,2,5,10,50] 3 # 修改要兌換的貨幣量money 4 money = 253
1 # 每種貨幣初始數量為 0 2 x = [0]*len(v) 3 # 建立兌換貨幣對應數量表 Q = [money+1][len(v)+1] 4 Q = [ ([0]*(len(v)+1))for i in range (0,money+1) ]
1 # Q 表初始化:首列首行都置0 2 for i in range (0,money+1): 3 Q[i][0] = 0 4 for i in range (0,len(v)+1): 5 Q[0][i] = 0
1 # 填表過程 2 for i in range (1,money+1): 3 for j in range (1,len(v)+1): 4 if v[j-1] == i: # 面值 = i 5 Q[i][j] = 1 6 elif v[j-1] > i: # 面值 > i 7 Q[i][j] = Q[i][j-1] 8 else: # 面值 < i 9 Q[i][j] = Q[i-v[j-1]][j] + 1 # i-v[j] 為 i 面值
函數調用:
1 print(Q);print('\n') 2 print('兌換得到最少的貨幣數量為:',Q[money][len(v)])
運行結果:
1 兌換得到最少的貨幣數量為: 7