卷上卷队——钟某人打卡的day23——贪心算法

贪心算法是一种解决多元最大最小值比较好的方法,就像名字一样,这个算法优先解决当前的最优解,但是不一定是全局最优解,这里我们看个题目

有一个背包,最多能承载重量为 C=150的物品,现在有7个物品(物品不能分割成任意大小),编号为 1~7,重量分别是 wi=[35,30,60,50,40,10,25],价值分别是 pi=[10,40,30,50,35,40,30],现在从这 7 个物品中选择一个或多个装入背包,要求在物品总重量不超过 C 的前提下,所装入的物品总价值最高。

如果是我,我会怎么选择?我肯定是优先寻找价值中的最大的,看看它值不值。这个过程我们可以转化为寻找pi/wi的最大值,接下来看代码

wi=[35,30,60,50,40,10,25]
pi=[10,40,30,50,35,40,30]
si = [pi[i]/wi[i] for i in range(len(wi))]
packet = 0
maxs = 150
try:
    while maxs >= min(wi):
        if maxs - wi[si.index(max(si))] >= 0:
 
            choose = si.index(max(si))
            maxs -= wi[choose]
            packet += pi[choose]
            wi.pop(choose)
            pi.pop(choose)
            si.pop(choose)
        else:
            choose = si.index(max(si))
            wi.pop(choose)
            pi.pop(choose)
            si.pop(choose)
except ValueError:
    pass
print(packet)

这里需要注意一点问题,如果是涉及到索引值的删除操作最好还是用pop方法,如果用remove的话会删除这个元素在表中第一次出现的位置,很容易出问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值