贪心算法有关案例分析

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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值