No.332
ナップザック問題ではあるが, 愚直にやると だし, 素直な DP でやると だしで間に合わない.
そこで, の条件を使う.
この条件から, となるのは高々20個であることがわかる. そこで, の要素だけ集めたものを として, の要素で作れる数値を DP で計算する. だけで作れる数値の最大値は であり, ループ回数は となるが, DP で行う操作はビットシフトとビットORで可能なので定数倍高速化で間に合わせる.
の要素だけ集めたものを として, BitDP で作れる数値を数え上げ, の要素で作れる数値と足して になるかどうか突き合わせる.
が作れたならばあとは経路復元で使う数値を取り出せばいい.
D言語のBitArrayは64の倍数でシフトしたときにバグがあるようで, コードでは無理やり回避している.