1.找零钱
def main(): #定义一个主函数
d=[0.01,0.02,0.05,0.1,0.2,0.5,1.0] #全部的硬币的种类
d_num=[] #每种硬币的数量,先定义为空列表,以放后面输入的每种硬币的数量
s=0 #拥有的零钱总和,让刚开始的钱是零,后面随着遍历的展开,不断累加
temp=input('请输入每种零钱的数量:')
d_num0=temp.split(" ")
for i in range(0,len(d_num0)): #每种硬币都要遍历一下
d_num.append(int(d_num0[i])) #循环里面实现累加的前提,可以打印d_num看下是什么效果
s+=d[i]*d_num[i] #计算出收银员有多少钱,也是不断遍历实现累加
sum=float(input("请输入需要找的零钱:"))
if sum>s: #当输入的总金额比收银员的总金额多时,无法找零
print("数据有错")
return 0
s=s-sum #剩下的零钱为原来的零钱减掉需要找的零钱
i=6 #有7种零钱需要遍历7次,且要从最大的零钱开始找零
while i>=0:
if sum>=d[i]: #如果要找的零钱大于等于第i个单个零钱
n=int(sum/d[i]) #那么要找的零钱数量就是用需要找的零钱除以该单位硬币,取整数
if n>=d_num[i]: #如果算出来的数量大于等于目前该硬币的所有数量
n=d_num[i] #那么就只能找目前该硬币的最大数量作为要找的零钱的数量
sum-=n*d[i] #还需要找多少零钱
print("用了%d个%f枚硬币"%(n,d[i]))
i-=1 #下一个
if __name__=="__main__": #执行函数
main()
注:以上代码来源于《python算法详解》
2、汽车加油问题
def greedy():
n=100 #汽车加满一次油可以跑100千米
k=5 #有5个加油站
d=[50,80,39,60,40,32] #每个加油站之间的距离
num=0 #需要加多少次油,先定为0
for i in range(k):
if d[i]>n: #如果加油站之间的距离大于加满一次油最多可以跑的距离
print('no solution')
return
i,s=0,0 #利用s进行迭代
while i<=k:
s+=d[i]
if s>=n: #当累计距离大于加满一次油可以跑的距离
s=d[i] #把最新的一个加油站作为第一个加油站
num+=1 #符合上面的条件意味着需要加一次油
i+=1 #下一个加油站
print(num)
if __name__=='__main__':
greedy()