找零问题——贪心算法

首先啥是贪心算法呢,通俗地说,就是只顾眼前利益,即每一步总是做出当前最好的选择。

很明显,这种算法的缺点就是不一定得到问题的最优解。好吧,但是它对大部分问题可以获得最优解,就算获得不了,也能获得近似最优解。

下面来看题目

超市的自动柜员机(POS机)要找给顾客钞票张数最少的现金。假设有面值为1元、3元和5元的钞票若干枚,问:如何用最少的钞票凑够11元找零?

第一步 算法模拟

1.定义函数,利用贪心算法求和为11的最优硬币组合,存入字典 change_dict中 ,并获得找零钞票的个数。

  新所凑钱数 = 原所凑钱数%当前最大面值

  原所凑钱数 = 新所凑钱数

  当前最大面值的个数 = 原所凑钱数//当前最大面值

2.检查解的可行性

3.主函数

第二步 编写代码

#(1)
def Change(billvaluelist,change):
    #billvaluelist是钞票的种类列表,change是要找的零钱
    #默认change>0
    billlist=billvaluelist
    billlist.sort(reverse=True)
    for i in billlist:
        changedict[i] = change//i
        newchange=change%i
        if change == 0:
            break
        else:
            change=newchange
    num=0
    for i in changedict:
        num+=changedict[i]
    return num
#(2)
def Check(changedict):
    sum=0
    for i in changedict:
        sum+=i*changedict[i]
    if sum==change:
        return True
    else:
        return False
#(3)
billvaluelist=[]
changedict={}
change = int(input('请输入找零钱数:'))
while True:
    x = int(input('请输入钞票种类,输入非正数结束:'))
    if x <= 0:
        break
    billvaluelist.append(x)
n = Change(billvaluelist,change)
if Check(changedict)==True:
    print('找零结果:',changedict)
    print('找零个数:',n)
else:
    print('无解')

输出结果:

找零问题——贪心算法_第1张图片

你可能感兴趣的:(T,贪心)