H<wiWH<w_i\leq Wなる荷物を1つ選択した後、その荷物より下にある荷物に対して、大きさの総和がWwiW-w_i以下になるように荷物を選択して価値の総和を最大化するKnapsack問題を考えると、

H<wiWH<w_i\leq Wなる全てのiiについての、((上記のKnapsack問題の答え)+vi+v_i) の最大値が問題の答えです。

愚直に実装すると間に合わないので工夫して考えます。


逆順に見ることを考えます。wwvvの数列を両方とも逆順にして、(上の荷物は下に、下の荷物は上になるように並び替えて、)

dp[i][j]=(dp[i][j] = (上からi1i-1番目の荷物まで見て、大きさの総和がjj以下になるように荷物を選んだときの価値の総和の最大値))

をそれぞれのiijjについて前計算します。

すると、ans=0ans=0を初期値として、H<wiWH<w_i\leq Wなる荷物それぞれに対し、
ansansmax(ans,dp[i][Wwi]+vi)max(ans, dp[i][W-w_i]+v_i)
のように答えを更新することで、O(NW)O(NW)でこの問題の答えを求めることができます。