# 贪心算法求解货币兑换问题
# 货币系统有 n 种硬币,面值为 v1,v2,v3...vn,其中 v1=1,使用总值money与之兑换,求如何使硬币的数目最少,即 x1,x2,x3...xn 之和最小
# 输入:各种货币的面值 v1,v2,v3...vn;要兑换的总值 money
# 输出:兑换得到最少的货币数量
1 # 修改面额 2 v = [50,10,5,2,1] 3 # 修改要兑换的货币量money 4 money = 253 5 # 每种货币初始数量为 0 6 x = [0]*len(v) 7 # 总货币初始数量为 0 8 count = 0
1 # 从最大面额开始兑换,剩余不足兑换大面额,则接着兑换小面额,直到兑换完成 2 for i in range (0,len(v)): 3 x[i] = money // v[i] # 取整符号// 4 money = money % v[i] # 取余符号% 5 for i in range (0,len(v)): 6 count = x[i] + count
1 print('通过贪心算法兑换得到的货币数量:',count) 2 print(' 其中,面值为 ',v) 3 print(' 的货币数量分别是 ',x)
运行结果:
1 要兑换的货币数量为: 253 2 通过贪心算法兑换得到的货币数量: 7 3 其中,面值为 [50, 10, 5, 2, 1] 4 的货币数量分别是 [5, 0, 0, 1, 1]
贪心法保证每步为最优,但不保证全局最优。也就是说,运用贪心法最终可得到非常理想的结果,但还并不是最优的。