EDPC D - Knapsack 1
ナップサック1
考え方
ABCでいうと、D問題級。
重さ制限がある中で、価値の合計を最大化する問題。
典型的な $0/1$ ナップサック問題である。
dp[j] を、総重量 $j$ 以下での最大価値とする。
各品物について、使う場合と使わない場合を比較しながら DP テーブルを更新する。
ただし、同じ品物を $2$ 回以上使わないようにするため、dp は重い方から更新する。
詳しくは「ナップサック問題」の記事参照。
計算量は $O(NW)$。
入力例1での動作
入力を受け取る。
n: 3
m: 8
w: {3, 4, 5}
v: {30, 50, 60}
重さ上限ごとに、得られる価値の最大値を持つ。
何も品物を見ていない間は、どの重さ上限でも価値は $0$ である。
$1$ 個目は重さ $3$、価値 $30$ である。
重さ上限が $3$ 以上なら、この品物を入れられる。
そのため、価値の最大値は $30$ になる。
$2$ 個目は重さ $4$、価値 $50$ である。
例えば、重さ上限 $8$ の場合を考える。
それまでの最大値は $30$ である。
$1$ 個目と $2$ 個目を入れると、価値は $30+50=80$ になる。
よって、最大値を $80$ に更新する。
$3$ 個目は重さ $5$、価値 $60$ である。
再び、重さ上限 $8$ の場合を考える。
それまでの最大値は $80$ である。
$1$ 個目と $3$ 個目を入れると、価値は $30+60=90$ になる。
よって、最大値を $90$ に更新する。
各品物まで処理した時点での状態は次のようになる。
| 重さ上限 | 初期状態 | $1$ 個目まで | $2$ 個目まで | $3$ 個目まで |
|---|---|---|---|---|
| $0$ | $0$ | $0$ | $0$ | $0$ |
| $1$ | $0$ | $0$ | $0$ | $0$ |
| $2$ | $0$ | $0$ | $0$ | $0$ |
| $3$ | $0$ | $30$ | $30$ | $30$ |
| $4$ | $0$ | $30$ | $50$ | $50$ |
| $5$ | $0$ | $30$ | $50$ | $60$ |
| $6$ | $0$ | $30$ | $50$ | $60$ |
| $7$ | $0$ | $30$ | $80$ | $80$ |
| $8$ | $0$ | $30$ | $80$ | $90$ |
重さ上限 $8$ での最大価値 $90$ が答え。
注意点
価値の和は、int 型からはみ出る。
long long 型を用いること。
別解
特になし。