AOJ 2333 - Problem D: 僕の友達は小さい

問題リンク

Hyado君が解いていたので

解説

重さを昇順にして、 w _ {1}, w _ {2}, w _ {3}, \cdots , w _ {n}としよう。

この時、

(絶対使うものは何もない)  (W - w _ {1}, W]を作る

( w _ {1}は絶対使う)  (W - w _ {2}, W - w _ {1}]を作る

( w _ {1}, w _ {2}は絶対使う)  (W - w _ {3}, W - w _ {2}]を作る

という風にしていけば、重複なく数え上げることができる。

区間の数え上げは重さを後述にみていけば自然とナップサック問題のDPで解くことができる。

計算量は O(n W)

提出コード

onlinejudge.u-aizu.ac.jp

まとめ

最近Hyado君のsubmissionを追いがち?