https://atcoder.jp/contests/abc153/tasks/abc153_e

dp[i][k]dp[i][k] = ii 番目までの魔法からダメージが kk 以上になるように選んだ時に消費するMPの最小値

とすると、個数制限なしナップザック問題(の類似)に帰着される。 (参考:蟻本の2章 p.p.58 漸化式を工夫する)

dp[i+1][k]=min(dp[i][k],dp[i+1][ka[i]]+b[i])dp[i+1][k] = \min(dp[i][k], dp[i+1][k-a[i]]+b[i])

である。ここで、dp[1][k]=0dp[-1][k] = 0dp[i][k]=0 (k<0)dp[i][k] = 0 \ (k < 0) とおいた。

答えは dp[n][h]dp[n][h] であり、O(nh)O(nh) で求められる。

https://atcoder.jp/contests/abc153/submissions/32290815