Knapsack Expect i-th

2 secs 1024 MB
RedSpica's icon RedSpica

dp+[i][j]:=dp_+[i][j]:=前からii番目までの荷物を見て,重さの総和がjjであるときの価値の総和の最大値
dp[i][j]:=dp_-[i][j]:=後ろからii番目までの荷物を見て,重さの総和がjjであるときの価値の総和の最大値
とします.この22つの配列の各要素は動的計画法によりO(NW)O(NW)で計算することができます.

ii番目の荷物を含めない場合の計算方法を考えてみましょう.
これは,前から(i1)(i-1)番目まで荷物を見た結果と, 後ろから(Ni)(N-i)番目まで荷物を見た結果より計算することができます.
また,前から(i1)(i-1)番目まで見て重さの総和がkkだった場合, 後ろから(Ni)(N-i)番目まで見た時に許容される容量の最大値は(Wk)(W-k)となります.

よって各iiについて以下の値を計算したものが答えとなります.

  • max0kW(dp+[i1][k]+dp[Ni][Wk])\max_{0 \leq k \leq W} (dp_+[i-1][k] + dp_-[N-i][W-k])

問題全体としての時間計算量はO(NW)O(NW)でこの問題の条件下では十分高速です.