首先啥是贪心算法呢,通俗地说,就是只顾眼前利益,即每一步总是做出当前最好的选择。
很明显,这种算法的缺点就是不一定得到问题的最优解。好吧,但是它对大部分问题可以获得最优解,就算获得不了,也能获得近似最优解。
下面来看题目
超市的自动柜员机(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('无解')
输出结果: