贪心算法之硬币找零

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 = [151025100]
    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

往期回顾

以上是关于贪心算法之硬币找零的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法算法导论 找零问题

贪心算法——找零钱问题

硬币找零问题的动态规划实现

数据结构与算法(12)—分治策略

贪心算法之找零问题

第六篇:从贪心算法理解程序的算法