• 贪婪算法之兑换硬币及问题所在


    问题:

    以人民币的硬币为例。如果硬币数量足够多。要求将一定数额的钱兑换成硬币。

    要求兑换硬币数量最少。


    思路说明:

    这是用贪婪算法的典型应用。

    在本例中用python来实现,主要思想是将货币金额除以某硬币单位。然后去整数。即为该硬币的个数。余数则做为向下循环计算的货币金额。

    这个算法的问题在于。得出来的结果不一定是最有结果。比方。硬币单位是[1,4,6],如果将8兑换成硬币。依照硬币数量最少原则。应该兑换成为两个4(单位)的硬币,可是。依照本算法。得到的结果是一个6单位和两个1单位的硬币。

    这也是本算法的局限所在。所谓贪婪算法。本质就是仅仅要找出一个结果。不考虑以后会怎么样。


    解决(Python)

    #!/usr/bin/env python
    #coding:utf-8
    
    
    def change_coin(money):
        coin = [1,2,5,10,20,50,100]     #1分。2分。5分,1角,2角,5角。1元
        coin.sort(reverse=True)
        money = money*100               #以分为单位进行计算
        change = {}
    
        for one in coin:
            num_coin = money//one       #除法,取整,得到该单位硬币的个数
            if num_coin>0:
                change[one]=num_coin
            num_remain = money%one      #取余数,得到剩下的钱数
            if num_remain==0:
                break
            else:
                money = num_remain
        return change 
    
    if __name__=="__main__":
        money = 3.42
        num_coin = change_coin(money)
        result = [(key,num_coin[key]) for key in sorted(num_coin.keys())]
        print "You have %s RMB"%money
        print "I had to change you:"
        print "    Coin    Number"
        for i in result:
            if i[0]==100:
                print "Yuan    %d    %d"%(i[0]/100,i[1])
            elif i[0]<10:
                print "Fen    %d    %d"%(i[0],i[1])
            else:
                print "Jiao    %d    %d"%(i[0]/10,i[1])
    
    #运行结果
    #You have 3.42 RMB
    #I had to change you:
    #    Coin    Number
    #    Fen    2    1
    #    Jiao    2    2
    #    Yuan    1    3

  • 相关阅读:
    造轮子杂记2
    Net分布式系统之五:微服务架构
    C#设计模式:责任链模式
    NET Core1.0之CentOS平台开发控制台程序DEMO
    WCF Routing 服务
    设计模式之外观模式
    设计模式之简单工厂模式
    Eclipse快捷键总结
    Spring容器的初始化流程
    IOC容器的创建
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10583143.html
Copyright © 2020-2023  润新知