2019年6月21日金曜日

TDPC H - ナップザック

TDPC H - ナップザック

0-basedで考える。また、(wi,vi,ci)(w_i, v_i, c_i)があらかじめ色の昇順にソートされているとする。f(x,y,z)f(x, y, z)を、物 0,1,...,x10, 1, ..., x-1からyy色以下、重さzz以下になるように選んで達成できる最大価値とすると、答えはf(N,C,W)f(N, C, W)である。

ffの漸化式を考える。物xxが色の先頭にない場合は普通のナップサック問題と同じように遷移する:

f(0,y,z)=0f(0, y, z) = 0 f(x,y,z)=max{f(x1,y,z)(x1を入れない)f(x1,y,zwx1)+vx1(x1を入れる) f(x, y, z) = \max \begin{cases} f(x-1, y, z) & (\text{物$x-1$を入れない})\\ f(x-1, y, z-w_{x-1})+v_{x-1} & (\text{物$x-1$を入れる}) \\ \end{cases}

xxがその色の先頭にある時はx1x-1から色が変わるため、新しい色を使う場合と使わない場合を比較しなければならない。p(x)p(x)を物xxのひとつ前の色を持つ品物の先頭とすると、次のように書ける:

f(x,y,z)=max{f(x1,y1,z)(x1の色を使うがx1は入れない)f(x1,y1,zwx1)+vx1(x1の色を使い、x1を入れる)f(p(x),y,z)(p(x), ..., x1の色を飛ばす) f(x, y, z) = \max \begin{cases} f(x-1, y-1, z) & (\text{物$x-1$の色を使うが$x-1$は入れない})\\ f(x-1, y-1, z-w_{x-1})+v_{x-1} & (\text{物$x-1$の色を使い、$x-1$を入れる}) \\ f(p(x), y, z) & (\text{物$p(x)$, ..., $x-1$の色を飛ばす}) \end{cases}

ただし、y=0y=0のときはもう新しい色を使えないのでf(x,0,z)=f(p(x),0,z)f(x,0,z) = f(p(x), 0, z)である。計算量はO(NWC){\mathcal O}(NWC)


以前に見たときは何がなんだかわからなかったが、今見たらあっさり解けた。ソートしてナップサックは典型らしい。