Menu
CoddyTech

Fractional Knapsack

中等贪心排序python iconjava iconcpp iconc iconjs icon+10

你有 n 件物品。第 i 件物品的价值为 values[i],重量为 weights[i]。你的背包最多能装 capacity 的总重量,而且你可以只取一件物品的一部分:第 i 件物品中重量为 w 的部分,价值为 values[i] × w / weights[i]。

编写一个名为 fractionalKnapsack 的函数,返回背包能装下的最大总价值,并向下取整为整数。

函数

fractionalKnapsack(values: integer-array, weights: integer-array, capacity: integer) → integer
valuesinteger-array
每个项目的值
weightsinteger-array
每件物品的重量
capacityinteger
袋子最多能装的重量
返回值integer
能装入背包的最大总价值,向下取整

约束条件

  • 1 ≤ n ≤ 5000,其中 n = values.length = weights.length
  • 1 ≤ values[i], weights[i] ≤ 104
  • 1 ≤ capacity ≤ 108

示例

输入
values = [40, 90, 30, 50]weights = [8, 30, 5, 20]capacity = 40
输出
151
解释
物品的单位重量价值分别为 5、3、6 和 2.5。完整装入物品 2 和 0,价值为 70,还剩 27 的容量。再装入物品 1 的 30 个单位中的 27 个,增加 81 的价值,总计 151。
challenge icon

进阶

你能在 O(n) 时间内找到答案,而不对所有物品进行排序吗?

重置代码
def fractionalKnapsack(values, weights, capacity):
    # 在这里编写代码

测试 #1

测试 #2

测试 #3

参数

values = [40, 90, 30, 50]
weights = [8, 30, 5, 20]
capacity = 40

预期输出

151