朴素: fj ← max {fj, fj − v, fj − 2v, fj − 3v, ⋯, fj − sv}(j ≥ sv)

1
2
3
4
0		1		2		3 ... v - 1
v v+1 v+2 v+3

j j+1 j+2 ... m
1
2
3
4
5
q v+q 2v+q 3v+q ... pv+q

dp[j] =max(dp[j])
dp[j + v]=max(dp[j + v] - w, dp[j]) + w
dp[j +2v]=max(dp[j +2v] - 2w, dp[j + v] - w, dp[j]) + 2w

dp[j+kv] 在队列中的实际应为 dp[j+kv]-kw

现在已知是第 i 个物品,同余类为 j,体积为 k = j + xv

假设单调队列中最大值为 a = j + yv,最后的 b = j + zv

判断出队:

k − a = (x − y)v

要求 x − y > s

那么 k − a > sv

a = j + yv