1469: 部分背包问题
题目描述
给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。如何选择装入背包的物品(物品可以被分割),可以使得装入背包中物品的总价值最大?
输入
每组输入包括三行,
第一行包括物品个数n,以及背包容量C。
第二、三行包括两个一维数组,分别为每一种物品的价值和重量。
输出
背包的最大总价值(保留到小数点后两位)
样例输入 Copy
5 10 6 3 5 4 6 2 2 6 5 4
样例输出 Copy
16.67
def knapsack(n, W, v, w):#贪心选择函数
p = [(v[i] / w[i], v[i], w[i]) for i in range(n)]
p.sort(reverse=True) # 按照单位重量的价值从大到小排序
value = 0
weight = W
i = 0
while i < n and weight > 0: #背包里还有容量的情况
unit_value, val, wt = p[i]
if wt < weight:
value += val
weight -= wt
else:
value += (weight / wt) * val# 计算剩余容量可以装入的部分的价值
weight=0#清理为了下次更好的循环
i += 1
return round(value, 2)
while True:
try:
n, W = list(map(int, input().split()))
v = list(map(int, input().split()))
w = list(map(int, input().split()))
result = knapsack(n, W, v, w)
print(result)
except EOFError:
break
循环终止的分析: