次の 個の品物から、重さの合計が 以下になるようにいくつか選ぶ。各品物は選ぶか選ばないかのどちらかで、同じ品物を 個以上選ぶことはできない。
| 品物 | A | B | C | D |
|---|---|---|---|---|
| 重さ | ||||
| 価値 |
品物を A, B, C, D の順に 番目とし、 番目の品物の重さを 、価値を とする。 を「 番目から 番目までの品物だけを使い、重さの合計が 以下になるように選んだときの価値の合計の最大値」とすると、 であり、 のとき
が成り立つ。この表を について埋め、選んだ品物の価値の合計の最大値 を求めよ。
品物と容量の 2 次元の表 を埋めて、容量以下での価値の合計の最大値を求められる
重さと価値が決まった品物が 個あり、それぞれを「入れる」か「入れない」かを選びます。重さの合計が容量 以下という条件のもとで、価値の合計の最大値を求めるのがこの技能です。各品物は 1 回までしか使えないため、0-1 ナップサック問題と呼ばれます。ここでは品物 の重さ と容量 がどれも 0 以上の整数であると仮定します(価値 は整数でなくてもかまいません)。予算内での投資の選び方や、時間内に解く問題の選び方など、限られた資源の配分を最適化する場面で使います。
硬貨の問題では、状態は「払う金額 」だけで足りました。同じ硬貨を何枚でも使えたからです。ナップサックでは各品物を 1 回しか使えません。そのため「どの品物まで検討したか」も状態に含める必要があります。そこで を「品物 だけを使い、重さの合計を 以下にしたときの価値の合計の最大値」と定めます(、 は の整数)。重さ と容量 が 0 以上の整数なので、容量の値としては の整数だけを考えれば足ります。さらに のとき も 以上 以下の整数になるので、 は表の中のマスを指します。品物を 1 つも使わなければ価値は 0 なので、 です。
品物 から選ぶ最適な選び方を考え、品物 を入れるかどうかで場合を分けます。入れない場合、残りは品物 から容量 以下で選ぶ問題なので、最大値は です。入れる場合は が必要です。品物 の分の容量 を差し引くと、残りは品物 から容量 以下で選ぶ問題になるので、最大値は です。最適な選び方はこの 2 つの場合のどちらかに必ず入ります。よって のとき 、 のとき が成り立ちます。
この式の右辺は 1 つ上の行(品物 まで)だけを参照します。そのため、行 から順に埋めれば、必要な値はいつもすでに求まっています。また、上の行を見ることで「品物 は 1 回だけ使う」ことが保証されます。表のマスは 個あり、1 マスあたり定数回の計算で済みます。
表を用意する:行 、列 (整数)の表 を作る
初期値を入れる:すべての について
行 を順に、各行では を埋める。 なら (品物 は入らない)
なら を計算する(入れない場合と入れる場合の大きい方)
最後に を読む。これが容量 以下での価値の合計の最大値
容量 のナップサックに、次の 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(重さ 、価値 )とわかる。
答え:
漸化式で同じ行を参照し、 としてしまう誤り。こうすると品物 を何度でも使えることになる。例題では となり、品物 1 を 2 回使った値が出てしまう。正しくは上の行の を参照する。
の列でも を計算しようとして、負の添字を参照してしまう誤り。品物 が入らない列では、正しくは とそのまま写す。
価値÷重さの大きい順に入れる貪欲法で答えを出してしまう誤り。たとえば容量 4 で、品物 A(重さ 3・価値 4、比 )と品物 B・C(各重さ 2・価値 2.5、比 )があるとする。比の大きい A を先に入れると、残り容量 1 には何も入らず価値は 4 になる。正しくは B と C を入れた が最大で、表を埋めれば必ず最大値が得られる。
「容量 以下」と「ちょうど 」を混同する誤り。(すべての )から始めると は「 以下」での最大値になる。ちょうど を求めたいなら、初期値を 、 で と変える必要がある。
この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。
次の 個の品物から、重さの合計が 以下になるようにいくつか選ぶ。各品物は選ぶか選ばないかのどちらかで、同じ品物を 個以上選ぶことはできない。
| 品物 | A | B | C | D |
|---|---|---|---|---|
| 重さ | ||||
| 価値 |
品物を A, B, C, D の順に 番目とし、 番目の品物の重さを 、価値を とする。 を「 番目から 番目までの品物だけを使い、重さの合計が 以下になるように選んだときの価値の合計の最大値」とすると、 であり、 のとき
が成り立つ。この表を について埋め、選んだ品物の価値の合計の最大値 を求めよ。
次の 個の品物から、重さの合計が 以下になるようにいくつかを選びます。各品物は選ぶか選ばないかのどちらかで、同じ品物を 個以上選ぶことはできません。
| 品物 | A | B | C | D |
|---|---|---|---|---|
| 重さ | ||||
| 価値 |
品物を A, B, C, D の順に 番目とし、 番目の品物の重さを 、価値を とします。 を「 番目から 番目までの品物だけを使い、重さの合計が 以下になるように選んだときの価値の合計の最大値」と定めます()。漸化式
(ただし のときは )を用いて表を埋め、選んだ品物の価値の合計の最大値 を求めてください。
次の 個の品物から、重さの合計が 以下になるようにいくつか選びます。各品物は選ぶか選ばないかのどちらかで、同じ品物を 個以上選ぶことはできません。
| 品物 | A | B | C | D |
|---|---|---|---|---|
| 重さ | ||||
| 価値 |
品物を A, B, C, D の順に品物 とし、品物 の重さを 、価値を とします。 を「品物 から までの中から、重さの合計が 以下になるように選んだときの価値の合計の最大値」と定めます()。
を使って表を埋め、重さの合計が 以下のときの価値の合計の最大値 を求めてください。