# 動態規劃法求解貨幣兌換問題
# 貨幣系統有 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
2for i in range (0,money+1):
3 q[i][0] =0
4for i in range (0,len(v)+1):
5 q[0][i] = 0
1#填表過程
2for i in range (1,money+1):
3for j in range (1,len(v)+1):
4if v[j-1] == i: #
面值 = i
5 q[i][j] = 1
6elif v[j-1] > i: #
面值 > i
7 q[i][j] = q[i][j-1]
8else: #
面值 < i
9 q[i][j] = q[i-v[j-1]][j] + 1 #
i-v[j] 為 i 面值
函式呼叫:
1print(q);print('\n'
)2print('
兌換得到最少的貨幣數量為:
',q[money][len(v)])
執行結果:
1 兌換得到最少的貨幣數量為: 7
動態規劃法
在學習動態規劃法之前,我們先來了解動態規劃的幾個概念 1 階段 把問題分成幾個相互聯絡的有順序的幾個環節,這些環節即稱為階段。2 狀態 某一階段的出發位置稱為狀態。3 決策 從某階段的乙個狀態演變到下乙個階段某狀態的選擇。4 狀態轉移方程 前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後...
動態規劃法
有些問題在分解時會產生許多子問題,且分解出的自問題互相交織,因而在解這類問題時,將可能重複多次解乙個子問題。這種重複當然是不必要的,解決方法可以在解決每個子問題後把它的解 包括其子子問題的解 保留在乙個 中,若遇到求與之相同的子問題時,dp演算法又稱動態規劃,是資訊學競賽中選手必須熟練掌握的一種演算...
動態規劃法
最近遇到了一道挺有意思的演算法題 四種硬幣 1元3元4元5元 問 想要湊成n元錢最少幾枚硬幣?public class coinsgamemain fun 7,is public static void fun int k,int is i1 l min i2 if l k private stat...