URAL - 1244 Gentlemen

  一道01背包的题目,只不过这一次不是用01背包来求最大值或最小值,而是将背包填满。这只需要将数组dp[]的dp[0]设为0,将其他设为 -∞即可(原因:这是为什么呢?可以这样理解:初始化的 F 数组事实上就是在没有任何物品可以放 入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为 0 的背包可以在什 么也不装且价值为 0 的情况下被“恰好装满”,其它容量的背包均没有合法的解,属于 未定义的状态,应该被赋值为 -∞ 了。如果背包并非必须被装满,那么任何容量的背包 都有一个合法解“什么都不装”,这个解的价值为 0,所以初始时状态的值也就全部为 0 了。)

  难点在于记录路径,同时处理多个解的情况。一开始我也想不到要怎么处理多个解的情况(总不能做两次dp吧),无奈去看题解,恍然大悟。具体见代码中的注释。

代码如下: