决策单调性优化 dp.
题意就是要求解一个 01 背包,但通常的 $O(nm)$ 的 dp 会超时.
注意到每种物品的体积不会超过 $300$ ,可以考虑设计与它相关的状态进行 dp .
设 $val(i,j)$ 表示选 $j$ 件体积为 $i$ 的物品能获得的最大收益.
设 $f(i,j)$ 表示考虑了所有体积 $\le i$ 的物品,花费了 $j$ 万元能获得的最大收益.
转移时枚举体积为 $i$ 的物品选了 $k$ 个,
$$
f(i,j)=\max_{k} \lbrace f(i-1,j-i\times k)+val(i,k) \rbrace
$$
注意到 $val(i,j)-val(i,j-1)$ 就是体积为 $i$ 的物品中,第 $j$ 大的收益,所以这个差值是不增的,即 $val(i)$ 是凸的.
于是我们把所有 $j$ 按照模 $i$ 分类,每一类内部具有决策单调性,可以用分治优化.
时间复杂度 $O(n\log n+\max C\cdot m\log m)$ .
1 | //%std |