技能一覧 › 大学数学 アルゴリズムと計算量

0-1 ナップサック問題の動的計画法

品物と容量の 2 次元の表 を埋めて、容量以下での価値の合計の最大値を求められる

前提

説明

重さと価値が決まった品物が 個あり、それぞれを「入れる」か「入れない」かを選びます。重さの合計が容量 以下という条件のもとで、価値の合計の最大値を求めるのがこの技能です。各品物は 1 回までしか使えないため、0-1 ナップサック問題と呼ばれます。ここでは品物 の重さ と容量 がどれも 0 以上の整数であると仮定します(価値 は整数でなくてもかまいません)。予算内での投資の選び方や、時間内に解く問題の選び方など、限られた資源の配分を最適化する場面で使います。

なぜそうしてよいのか

硬貨の問題では、状態は「払う金額 」だけで足りました。同じ硬貨を何枚でも使えたからです。ナップサックでは各品物を 1 回しか使えません。そのため「どの品物まで検討したか」も状態に含める必要があります。そこで を「品物 だけを使い、重さの合計を 以下にしたときの価値の合計の最大値」と定めます(、 は の整数)。重さ と容量 が 0 以上の整数なので、容量の値としては の整数だけを考えれば足ります。さらに のとき も 以上 以下の整数になるので、 は表の中のマスを指します。品物を 1 つも使わなければ価値は 0 なので、 です。

品物 から選ぶ最適な選び方を考え、品物 を入れるかどうかで場合を分けます。入れない場合、残りは品物 から容量 以下で選ぶ問題なので、最大値は です。入れる場合は が必要です。品物 の分の容量 を差し引くと、残りは品物 から容量 以下で選ぶ問題になるので、最大値は です。最適な選び方はこの 2 つの場合のどちらかに必ず入ります。よって のとき 、 のとき が成り立ちます。

この式の右辺は 1 つ上の行(品物 まで)だけを参照します。そのため、行 から順に埋めれば、必要な値はいつもすでに求まっています。また、上の行を見ることで「品物 は 1 回だけ使う」ことが保証されます。表のマスは 個あり、1 マスあたり定数回の計算で済みます。

手順

  1. 表を用意する:行 、列 (整数)の表 を作る

  2. 初期値を入れる:すべての について

  3. 行 を順に、各行では を埋める。 なら (品物 は入らない)

  4. なら を計算する(入れない場合と入れる場合の大きい方)

  5. 最後に を読む。これが容量 以下での価値の合計の最大値

例題

容量 のナップサックに、次の 3 個の品物から選んで入れる。品物 1:重さ 2・価値 3、品物 2:重さ 3・価値 4、品物 3:重さ 4・価値 6。各品物は高々 1 個しか入れられない。重さの合計が 6 以下となるときの価値の合計の最大値を、動的計画法で求めよ。

例題の解答

重さと容量はすべて 0 以上の整数なので、列は の整数で足りる。
【手順 1・2】行 、列 の表を作り、行 0 をすべて 0 にする:。
【手順 3・4】()。 は なので上の行をそのまま写し、0 と 0。 では 。よって 。
()。 は上を写して 。:。:。:。:。よって 。
()。 は上を写して 。:。:。:。よって 。
【手順 5】 が答えになる。 で、 は品物 1 によるものなので、選び方は品物 1 と品物 3(重さ 、価値 )とわかる。

答え:

よくある誤り

この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。

入口の問題

この技能を使う問題