【なっぷさっくもんだい】
ナップサック問題 とは?
最終更新:
💡 リュックに何を詰める?重さの上限で最大の価値を狙うパズル
容量制限のあるナップサック(リュックサック)に、価値の合計が最大になるように物を詰め込む最適化問題。動的計画法の代表例として知られる。
📌 このページのポイント
- 重さの上限を超えず、選んだ品物の価値の合計を最大にする問題
- 0–1型では、各品物を丸ごと入れるか入れないかを選ぶ
- 整数の重さ・容量なら、品物数nと容量Wに対してO(nW)の動的計画法がある
- 一般の0–1型はNP困難で、容量が大きいと動的計画法も重くなる
ナップサック問題って、リュックに荷物を詰める話なの?
重さの上限を超えず、価値の合計を最大にする選び方を考える問題だよ。ここでは各品物を丸ごと入れるか入れないかを選ぶ0–1型を考える。図の重さと価値は説明用の架空の設定なんだ。
10kgまでで、図の3つから選ぶと?
品物が増えたら、全部の組み合わせを調べるの?
n個それぞれを入れるか入れないかで、候補は2のn乗通りになる。30個なら約10億通りだね。容量や品物までの部分問題の結果を記録する動的計画法など、全部を列挙する以外の解き方があるよ。
動的計画法なら、どんな大きさでもすぐ解ける?
重さと容量を整数で扱う基本的な方法の計算量はO(nW)だよ。Wは容量の数値なので、品物が少なくてもWが巨大なら重い。入力を表す桁数に対して常に多項式時間という意味ではなく、擬多項式時間と呼ぶんだ。
実際の資源配分も、全部この問題になるの?
まとめ:ざっくりこれだけ覚えればOK!
「ナップサック問題」って出てきたら「限られた容量で最大の価値を詰め込む最適化パズル」と思えればだいたいOK!
📖 おまけ:英語の意味
「Knapsack Problem」 = 背負い袋に詰める問題
💬 Knapsackは背負い袋のこと。「何を袋に入れるか」という形で、容量の制約と価値を最大にする選択を表しているよ