Typical DP Contest A問題 : コンテスト

問題. コンテスト

 N 問の問題があり, i 問目の配点は  p_i 点である.考えうる得点は何通りかを求めよ.
制約 1 \le N \le 100,  1 \le p_i \le 100

解法. 動的計画法

 f(i, j) i 問目までの問題を解いて得点を  j とする解き方があるかどうかを表すブール値関数とします.得点が0となる場合  f(0, 0) の初期値を true として, i 番目の問題を解くことを考えます. f(i - 1, j) が true のとき, i - 1 問目までの問題で得点を  j とする解き方があったので,その解き方に  i 問目の問題を正解することによって,  f(i, j + p_i) の値を true とすることができます.したがって,
  f(i, j) = f(i - 1, j) \lor f(i - 1, j - p_i)
となります. f(i, j) を2次元配列で持ち,上の漸化式で更新すると  \left|\{j \mid f(N, j), 0 \le j \le S \} \right| が答えとなります.ただし, S は得点の最大値とします.

上の漸化式の  j の値を  S から減少させながら更新すると1次元配列で,
  f(j) = f(j) \lor f(j - p_i)
を計算することによって答えを求めることができます.

他に,bool型の配列ではなくbitsetで持つ解法を載せます.「score << p」 は全ての  j に対して  f(i, j + p_i) の計算を行っています.

計算時間 O(N S)

感想

ナップサック型の動的計画法でテーブルの定義や遷移方法なども同様にできて,本当に典型問題という感じです.