这题对于我这种蒟蒻来说可谓是难度很大。作为pat少数的dp题,这题也有它的亮点。
①物品的价值和重量公用一个向量w
②如果最终dp[m]不等于m,说明无解
③要求结果(w序列)字典序最小
dp数组滚动示意图:
这题的标准答案是dp数组滚动。与普通无优化的背包问题不同,内循环:背包容量循环是从m(最大容量)递减到当前物品的容量。并且上个物品的dp值也是被记录在当前索引前面,起到了优化作用。
而“字典序最小”是通过① w数组递减排序 和 ②状态转移时使用<= 来实现的。普通的背包问题在转移时使用“<” 来判断,而这题进行了递减排序,字典序大的先被记录为解,如果出现了字典序小的方案,其dp值“==”上一个解的dp值,被重新记录,达到了字典序最小的效果。
下面演示“字典序最小”的工作机制:
●如果我们不进行递减排序,而是进行递增排序:
运行结果:
我们得到了字典序最大的解。
●我们进行递减排序:
其本质是新解对旧解的覆盖。
AC代码(滚动优化):
#include #include #include #include #include #include #include #include #include #include