贪心算法之硬币找零
Posted AI小白奋斗史
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法之硬币找零相关的知识,希望对你有一定的参考价值。
零.算法概览
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
贪心算法一般用来求解优化问题,问题描述中包括最小、最多、最长等词语。
(官方)贪心算法求解问题的步骤:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。
(通俗)贪心算法求解问题的步骤:
1. 确定备选集合I
2. 给定解的集合S,利用贪心策略确定选择的元素,直到满足题目要求
(1) 设计贪心策略。从I中选择一个元素加入到S中。
(2) 实现贪心策略。
一.题目描述
某种货币的硬币有如下几种的面值:1元, 5元,10元,25元,100元,且数量不限,现在要用这些钱来支付a元,求出最小等于a的硬币个数。
比如
a = 36元
则可能有以下方案:
方案一:36个一元,36个硬币
方案二:3个十元,1个五元,1个一元,5个硬币
方案三:1个二十五元,1个十元,1个一元,3个硬币
显然,方案三符合要求。
二.解题思路
1. 设计贪心策略。每一步尽可能用面值大的硬币即可.
2. 实现贪心策略。
可以通过两个方法实现”从I中选择最接近a的面值”
(1) 作差:min(a-I[1,5,10,25,100],0)
(2) 求商:min(a/I)---优选
三.编程实现
def get_min_coins(a):
coins = [1, 5, 10, 25, 100]
s_coins = sorted(coins, reverse=True)
solution = []
for c in s_coins:
num_coin = int(a / c)
solution += [c, ] * num_coin
a = a - c * num_coin
if a <= 0:
break
return solution
# 测试
print(get_min_coins(36))
END
往期回顾
以上是关于贪心算法之硬币找零的主要内容,如果未能解决你的问题,请参考以下文章