TDPC H - ナップザック

考え方

特殊なナップサック問題。
基本的なナップサック問題については、「ナップサック問題」の記事参照。

今回の特殊な点は、色数が指定数以下でなくてはならない点。
そこで、DPテーブルは、色数も持たせて通常より $1$ 次元多くする。

そして、更新は、同じ色の荷物をまとめて扱う。
例えば、色 $5$ であるグループを反映する場合、仮に指定色数が $3$ だとして、以下のようにする。

まず、色数が $2$ 以下である部分をDPテーブルからコピーする。
それを通常ナップサック問題のインプレース更新と同じ要領で、色 $5$ である荷物全てについて処理する。
その後、色数が $3$ 以下である部分に対し、今求めた各重さでの最大価値が大きければ更新する。
これを、色数 $1$ 以下から色数 $2$ 以下へ、色数 $0$ 以下から色数 $1$ 以下へも行う。

これを全ての色について処理すれば、答えが出る。

計算量は $O(NKW)$。

入力例1での動作

入力を受け取る。
以下では、重量制限を m、色数制限を k とする。

n: 4
m: 5
k: 2
w: {1, 1, 1, 10}
v: {10, 20, 30, 100}
c: {1, 2, 3, 4}

まず、荷物を色ごとに分ける。

色1: {(1, 10)}
色2: {(1, 20)}
色3: {(1, 30)}
色4: {(10, 100)}

dp[i][j] を、$i$ 色以内、重さ $j$ 以下で選んだときの最大価値とする。

色 $1$ の荷物を処理すると、DP テーブルは次のようになる。

色数\重さ $0$ $1$ $2$ $3$ $4$ $5$
$0$ 0 0 0 0 0 0
$1$ 0 10 10 10 10 10
$2$ 0 10 10 10 10 10

色 $2$ の荷物まで処理すると、次のようになる。

色数\重さ $0$ $1$ $2$ $3$ $4$ $5$
$0$ 0 0 0 0 0 0
$1$ 0 20 20 20 20 20
$2$ 0 20 30 30 30 30

色 $3$ の荷物まで処理すると、次のようになる。

色数\重さ $0$ $1$ $2$ $3$ $4$ $5$
$0$ 0 0 0 0 0 0
$1$ 0 30 30 30 30 30
$2$ 0 30 50 50 50 50

色 $4$ の荷物は重さが $10$ なので、重量制限 $5$ の範囲では追加できず、DP テーブルは変化しない。

最終的に dp[2][5] = 50 となるので、答えは $50$。

注意点

特になし。

別解

特になし。