题目描述
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正实数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正实数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。(四舍五入)
样例输入 Copy
3 20
18 15 10
75 72 45
样例输出 Copy
94.50
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 '{:.2f}'.format(value)
while True:
try:
n, W = list(map(int, input().split()))
w = list(map(int, input().split()))
v = list(map(int, input().split()))
result = knapsack(n, W, v, w)
print(result)
except EOFError:
break
在oj上运行只有百分之14正确,应该如何修改