贪心算法是一种解决多元最大最小值比较好的方法,就像名字一样,这个算法优先解决当前的最优解,但是不一定是全局最优解,这里我们看个题目
有一个背包,最多能承载重量为 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的话会删除这个元素在表中第一次出现的位置,很容易出问题的。