题解
这道题第一眼看是维护前缀后缀然后合并的,但是这样复杂度很高,据说可以水过
因此,不考虑合并。那么问题就是去掉每一个物品,做一次多重背包。这样的复杂度为\(O(n^2m)\)。
考虑以上算法的重复计算部分。可以发现有许多是重复计算了的。那么就可以考虑分治,因为分治可以省去许多重复计算。那么算法就显而易见了。
代码
1 |
|
这道题第一眼看是维护前缀后缀然后合并的,但是这样复杂度很高,据说可以水过
因此,不考虑合并。那么问题就是去掉每一个物品,做一次多重背包。这样的复杂度为\(O(n^2m)\)。
考虑以上算法的重复计算部分。可以发现有许多是重复计算了的。那么就可以考虑分治,因为分治可以省去许多重复计算。那么算法就显而易见了。
1 | #include <cstdio> |