EDPC E - Knapsack 2
ナップサック2
考え方
ABCでいうと、D問題級。
重さ制限がある中で、価値の合計を最大化する問題。
典型的な $0/1$ ナップサック問題である。
ただし、今回は重さ制限 $W$ が非常に大きい。
そのため、D 問題のように重さを DP テーブルの添字にすると間に合わない。
そこで、価値の方を DP テーブルの添字にする。
dp[j] を、総価値 $j$ での最小総重量とする。
各品物について、使う場合と使わない場合を比較しながら DP テーブルを更新する。
ただし、同じ品物を $2$ 回以上使わないようにするため、dp は価値が大きい方から更新する。
最後に、最小総重量が $W$ 以下である価値のうち、最も大きいものを探せばよい。
詳しくは「ナップサック問題」の記事参照。
計算量は $O(N\sum V)$。
入力例1での動作
入力を受け取る。
n: 3
m: 8
w: {3, 4, 5}
v: {30, 50, 60}
総価値ごとに、それを達成するための最小総重量を持つ。
ここでは、達成可能な状態だけを追う。
状態は $(\text{総価値},\text{最小総重量})$ の組で表す。
(実際には、中身がほとんど $\infty$ になっている配列に入っている)
まだ品物を見ていない。
この時点では、総価値 $0$ だけを総重量 $0$ で達成できる。
{
(0, 0)
}
$1$ 個目は重さ $3$、価値 $30$ である。
この品物を使うことで、総価値 $30$ を総重量 $3$ で達成できる。
{
(0, 0),
(30, 3)
}
$2$ 個目は重さ $4$、価値 $50$ である。
この品物だけを使う状態が増える。
また、$1$ 個目と組み合わせる状態も増える。
{
(0, 0),
(30, 3),
(50, 4),
(80, 7)
}
$3$ 個目は重さ $5$、価値 $60$ である。
この品物を使うことで、総価値 $60,90,110,140$ の状態が増える。
{
(0, 0),
(30, 3),
(50, 4),
(60, 5),
(80, 7),
(90, 8),
(110, 9),
(140, 12)
}
重さ制限は $8$ である。
したがって、総重量が $8$ 以下の状態だけを使える。
その中で最大の総価値は $90$ なので、答えは $90$。
注意点
総重量は、int 型からはみ出る。
long long 型を用いること。
別解
特になし。