# 动态规划法求解货币兑换问题
# 货币系统有 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