計算複雑性理論における計算の難しさの議論の対象となる問題のひとつ。
容量 C のナップサックが一つと、n 個の品物(各々、価値 pi, 容積 ci)が与えられたとき、ナップサックの容量 C を超えない範囲でいくつかの品物をナップサックに詰め、ナップサックに入れた品物の価値の和を最大化する問題。NP困難であることが知られている。全ての品物について pi=ci が成り立つとき、部分和問題と等価であるため、この問題を含んでいる。
どれを持ち帰る?冒険者が旅の途中、たくさんの宝物を見つけました。 しかし、持ち帰れるのは8kgまでです。 持ち帰る宝物の価値が最も高くなるには、どれを持ち帰ればいいのか。 それを知るべく我々はアマゾンの奥地「動的計画法」の奥地へ向かった・・・。 ナップサック問題を考える bit全探索 実装 動的計画法 実装 メモ化再帰 ループ ループ(一次元配列メモ) 選択した要素の取得 →その①「フィボナッチ数列」 →その③「部分和問題」 ナップサック問題を考える 冒頭に挙げたような問題は「ナップサック問題」と呼ばれる。 組合せ最適化問題の一つだ。問題を解くには、各要素を選ぶor選ばないの二択で考えていく。…
はじめに 定期テストに向けて、Karp's Reduction の流れに沿って、諸々の問題の NP 完全性を示すことができるように勉強する必要が生じた。 ここでは、ナップサック問題が弱 NP 完全問題であることを、Partition が弱 NP 完全問題であることを利用して、証明する。 Partition について Partition における入力は、 個の要素からなる整数集合 である。 出力すべきは、 ある で、 \begin{equation} \sum_{i \in X} a_i = \sum_{i \not \in X} a_i \end{equation} を満たす X は存在するか…
数学の具体的な問題にPythonを使って、数学もPythonも同時に学んでしまいましょう。今回はPythonを使った確率・統計の問題として、ナップサック問題をみてみたいと思います。重量と価値の決まった品物をナップサックに詰める問題ですが、ナップサックには重量制限があり、制限を満たすなかで詰め込んだ品物の価値を最大化するのはどのような組み合わせか?という問題で、実用上も面白い問題です。ここでは重量に制限があるとしましたが、容量と読み替えても同じですし、あるいは問題をより複雑にするためには、重量と容量の両方に制限を設けて考察することもできるでしょう。今回は問題を簡単にするために重量のみについて制限…
はじめに 動的計画法 ナップサック問題 例題 考え方 実装例 おわりに 参考 はじめに こんにちは.talosです.今回はナップサック問題を例題に,動的計画法を説明します.競技プログラミングとかでもよく使われるので,これから挑戦しようという人は必見です. 動的計画法 動的計画法(DP:Dynamic Programming)は問題を部分問題に分割し,それらを解くことで最終的な解を求める方法です.似たような方法に分割統治法がありますが,これとの違いは部分問題を解いた結果を保存しておくことです.これによって,分割統治法でよくある同じ部分問題を何度も解いてしまうということを避けることができます.言葉…