ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-03-23 11:42:58  阅读:269  来源: 互联网

标签:硬币 money 问题所在 算法 num coin change


问题:

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

要求兑换硬币数量最少。


思路说明:

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

在本例中用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

标签:硬币,money,问题所在,算法,num,coin,change
来源: https://www.cnblogs.com/mqxnongmin/p/10583143.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有