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
説明
重量1単位あたりの品物の価値は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