アルゴリズムと計算量の問題
次の 個の品物から、重さの合計が 以下になるようにいくつか選ぶ(各品物は選ぶか選ばないかのどちらかで、同じ品物を 個以上選ぶことはできない)。
| 品物 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 重さ | ||||||
| 価値 |
選んだ品物の価値の合計の最大値を求めよ。
この問題で使うもの
- 0-1 ナップサック問題の動的計画法(説明と入口の問題)
この問題を解けるようになるまで(2 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
ナップサック問題なので、 =「重さ 以下での価値の最大値」を品物を 個ずつ加えながら更新する。
ヒント 2
品物(重さ 、価値 )を加えるときの更新式は 。同じ品物を 回使わないよう、 は大きい方から更新する。
ヒント 3
A, B, C, D, E まで加えた時点で 、 となる。最後に F(重さ )を加えるとき がどう変わるかを調べる。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
ナップサック問題として動的計画法で解く。品物を A, B, C, D, E, F の順に考え、 を「ここまでの品物から重さの合計が 以下になるように選んだときの価値の最大値」とする()。品物(重さ 、価値 )を加えるとき、 を大きい方から順に
と更新する。
の順に を並べると次のようになる。
- 初期:
- A(, )を加えた後:
- B(, )を加えた後:
- C(, )を加えた後:
- D(, )を加えた後:
- E(, )を加えた後:
- F(, )を加えた後:
確認のため主な更新を書く。C を加えたとき (A, B, C)。D を加えたとき 、。E を加えたとき、たとえば 、 で、どの値も増えない。F を加えたとき 、。
よって最大値は で、たとえば C と F(重さ 、価値 )や A, D, F(重さ 、価値 )で達成される。
(検算:重さの小さい 個 D, A, B, C の重さの合計が なので、選べるのは高々 個。重さ 以下の 個の組は ABC(), ABD(), ACD(), ADE(), BCD(), BDE(), ADF()で、 個の組の最大は CF()。したがって最大値は である。)
別解
価値/重さの比は D が 、F が 、C が 、A と E が 、B が 。
上界: 品物を分割してよいとする緩和問題では、比の大きい順に D(重さ 、価値 )、F(重さ 、価値 )、C を入れる。D と F で重さ 、価値 。残り容量 に C を だけ入れると価値 で、合計 。価値は整数なので最大値は 以下。
達成: C+F(重さ 、価値 )。また A+D+F(重さ 、価値 )も 。
他の主な組も確認: A+B+C(重さ )は 、B+D+E(重さ )は 、C+E(重さ )は 、B+F(重さ )は 。いずれも 以下。
答え: