这是精华:
#一个背包,背包容量是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。