贪心算法-贪婪法

这是精华:

#一个背包,背包容量是M=140。有8个物品,物品不可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
#物品  A     B     C     D    E      F     G     H
#重量 25,   30,   6,  50,  40,   10,   25,   3
#价值 10,   40,  30,  50,  35,   40,   30,  15
m = 140
weight = {0:25,1:30,2:6,3:50,4:40,5:10,6:25,7:3}
values = {0:10,1:40,2:30,3:50,4:35,5:40,6:30,7:15}
f = [0,1,2,3,4,5,6,7]
v = []
n = 0
l = 0
for i in f:
 a = float(weight[i])
 b = float(values[i])
 c = b/a
 v.append(c)
c = sorted(v)
c = c[::-1]
for i in range(len(v)):
 if n < m:
  for j in f:
   if c[i] == v[j]:
    n = n + weight[j]
    l = l + values[j]
    v[j] = 0
    if n < m:
     print("选择" + str(j) + "号物品")
     break
    if n > m:
     n = n - weight[j]
     l = l - values[j]
     break
print("价值" + str(l))
print("重量" + str(n))

写的我心累,总算是写出来了,虽然写的看起来长了点

首先写这个代码,我遇见了人类史上最大的问题,这题目是啥意思?

不过想了想还是很简单的,就是求单位重量的价值(简称 单价),单价越高越好。

下面就简单了,建立一个单价列表,它的下标和重量、价值的下标对应。把单价排序,高的在前面,用sorted排序是小的在前面,所以要用c[::-1]切片倒过来,把排好的单价放在另一个列表里,这是我们有两个单价列表了

原来的列表v = []
排好的列表c = []

利用循环依次确定 c[ i ] 的值和 v[ j ] 的值相等的时候,如当c[ 0 ] = v[ j ] 时,这是的 j 就是价值、重量的下标,将重量【 j 】加起来和 140 比较。

最后输出。

注意:小心单价相同时,会重复读取,所以读取完一个把它的单价变为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值