Menu
CoddyTech

0/1 Knapsack Problem

ふつう動的計画法python iconjava iconcpp iconc iconjs icon+10

n個の品物があります。品物iの重さはweights[i]で、価値はvalues[i]です。バッグに入れられる重さの合計は最大でcapacityです。各品物は1つずつしかなく、丸ごと入れるか、入れずに残すかのどちらかです。バッグに入れられる価値の合計の最大値を返してください。

関数

knapsack(weights: integer-array, values: integer-array, capacity: integer) → integer
weightsinteger-array
各項目の重み
valuesinteger-array
各項目の値
capacityinteger
バッグが運べる最大重量
戻り値integer
容量内に収まる重さのアイテムの合計価値の最大値

制約

  • 1 ≤ n ≤ 100、ここで n = weights.length = values.length
  • 1 ≤ weights[i] ≤ 1000
  • 1 ≤ values[i] ≤ 104
  • 1 ≤ capacity ≤ 1000

例

入力
weights = [4, 2, 3, 5]values = [10, 4, 7, 12]capacity = 7
出力
17
説明
品物0と2の重さは4 + 3 = 7で、価値は10 + 7 = 17です。最も価値の高い品物(重さ5、価値12)を最初に詰めると、品物1だけを入れる余地が残り、合計は16になります。
challenge icon

発展問題

容量が10^9に達する一方で、値の合計が最大でも10^4だとします。テーブルは何を基準にインデックス付けしますか?

コードをリセット
def knapsack(weights, values, capacity):
    # ここにコードを書いてください

テスト #1

テスト #2

テスト #3

引数

weights = [4, 2, 3, 5]
values = [10, 4, 7, 12]
capacity = 7

期待される出力

17