TDPC A - コンテスト
考え方
ABCでいうと、D問題級。
典型的な部分和問題である。
dp[j] を、総和を $j$ にできるかどうかとする。
各数について、使う場合と使わない場合を調べて DP テーブルを更新する。
ただし、同じ数を $2$ 回以上使わないようにするため、dp は大きい方から更新する。
詳しくは「動的計画法」「ナップサック問題」の記事参照。
計算量は $O(N\sum p_i)$。
入力例1での動作
入力を受け取る。
n: 3
p: {2, 3, 5}
配点の総和は $2+3+5=10$ なので、dp[0] から dp[10] までを用意する。
dp[j] を、総得点 $j$ を作れるかとする。
DP テーブルは次のように更新される。
T は true、F は false を表す。
| 使用した配点\総得点 | $0$ | $1$ | $2$ | $3$ | $4$ | $5$ | $6$ | $7$ | $8$ | $9$ | $10$ |
|---|---|---|---|---|---|---|---|---|---|---|---|
| なし | T | F | F | F | F | F | F | F | F | F | F |
| $2$ まで | T | F | T | F | F | F | F | F | F | F | F |
| $3$ まで | T | F | T | T | F | T | F | F | F | F | F |
| $5$ まで | T | F | T | T | F | T | F | T | T | F | T |
最終的に dp が true である総得点は $7$ 個あるので、答えは $7$。
注意点
特になし。
別解
特になし。