模板
参考:知乎
要求恰好装满还是不要求恰好
我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目 要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别 这两种问法的实现方法是在初始化的时候有所不同。
如果是第一种问法,要求恰好装满背包,那么在初始化时除了 F[0] 为 0,其它 F [1…V ] 均设为 −∞,这样就可以保证最终得到的 F [V ] 是一种恰好装满背包的最优解。
如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将 F [0…V ] 全部设为 0。
这是为什么呢?可以这样理解:初始化的 F 数组事实上就是在没有任何物品可以放 入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为 0 的背包可以在什 么也不装且价值为 0 的情况下被“恰好装满”,其它容量的背包均没有合法的解,属于 未定义的状态,应该被赋值为 -∞ 了。如果背包并非必须被装满,那么任何容量的背包 都有一个合法解“什么都不装”,这个解的价值为 0,所以初始时状态的值也就全部为 0 了。
- dp[0]=0, dp[1:]为-1时,恰好装满
- dp[0]=0, dp[1:]为0时,可能装不满
求最小包还是最大包
- 最大包需要将dp后序除了dp[0]其他设为0或者-1。
- 最小包需要将dp除了dp[0]其他设为无穷大。初始化时将临时数组dp赋值为最大值,并dp[0]=0,最后如果不能完全匹配,也就是dp[最大值]不变,便输出不可能。