如果你 wa 了,并且是这个做法:
若同一大小的堆 >2 个,那么将这种大小的堆删除 2 个,反复对每个堆执行此操作。
在操作结束之后的结果中进行 dp。
- 你的做法是先尽可能多的两个两个的删同一种类,在剩余的物品里面 dp,此时两个两个删同一种类的方案数没有被考虑。
- 接下来,如果你计算了两个两个删同一种类的方案数,但是算出来的方案数大于标准答案,举个简单的例子,有 10 件同一类型的物品,最优解中全部都删掉了,那么标准答案是 1 种方案,但是你计算的方案数为 210×9×1=45,即两个两个删的方案数乘 dp 方案数。
- 接下来,如果你将 dp 方式进行了修改,每 dp 到一种类型的时候,直接根据这种类型剩余多少个进行计算(当然,贪心方式仍然是先两个两个删到 ≤2 个的状态),那么你会发现方案数还是错了。
- 这种 dp 状态实际上不能求出所有解
Hack.in
4 1
3 3 2 3
1 4
Hack.out
2 3
按照上述 dp 状态会输出 −1。
事实上保留 3,3 是最优解。
但是提前删除了两个 3,剩下的两个数不能形成任意一组合法的解。
考虑 dp 过程中枚举当前种类保留几个数(肯定少于 2),就能完美解决这个问题。