题目:
假设有n中物品和一个购物车,物品i的价值为vi,重量wi,购物车的容量为W。每种物品只有一件,要么放入,要么不放入,不可拆分。在不超过购物车容量的情况下,选择将哪些物品放入购物车,能使放入的物品价值最高?
# 购物车载重量
W = 10
# 物品个数n
n = 5
# 物品重量
w = [2, 5, 4, 2, 3]
# 物品价值
v = [6, 3, 5, 4, 6]
# 物品单价
p = []
for i in range(n):
p.append(v[i]/w[i])
print(p)
# 物品标签
k = [i for i in range(1, n+1)]
# 物品
arr = []
arr.append(w)
arr.append(v)
arr.append(p)
arr.append(k)
print(arr)
# 按单价降序,如果单价一样,按重量降序
sorted_arr = [list(x) for x in zip(
*sorted(zip(*arr), key=lambda x: (x[2], x[0]), reverse=True))]
print(sorted_arr)
# 总重量
sw = 0
# 总价值
sv = 0
i = 0
while sw < W:
sw += sorted_arr[0][i]
sv += sorted_arr[1][i]
# del w[sorted_arr[3][i]]
temp = sorted_arr[1][i-1]
v[sorted_arr[3][i]-1] = 0
i += 1
i -= 1
sw -= arr[0][i]
print(sv)
print(arr[1][i])
sv -= temp
gap = W-sw
mv = 0
for i in range(len(w)):
if w[i] <= gap and v[i] > mv:
mv = v[i]
sv += mv
print("实际重量为", sw)
print("最大价值为", sv)