背包九讲第一讲-简单的0/1背包问题有感1.4

在背包九讲中,还提及到了初始化的问题

这是来自崔添翼 (Tianyi Cui, a.k.a. dd_engi)老师的背包九讲的讲解:


1.4 初始化的细节问题
我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。 有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背 包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。

如果是第一种问法,要求恰好装满背包,那么在初始化时除了F[0]为0,其 它F[1..V ]均设为−∞,这样就可以保证最终得到的F[V ]是一种恰好装满背包的 最优解。 如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该 将F[0..V ]全部设为0。 这是为什么呢?可以这样理解:初始化的F数组事实上就是在没有任何物 品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量 为0的背包可以在什么也不装且价值为0的情况下被“恰好装满”,其它容量的 背包均没有合法的解,属于未定义的状态,应该被赋值为-∞了。如果背包并非 必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的 价值为0,所以初始时状态的值也就全部为0了。 这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状 态转移之前的初始化进行讲解。


一开始我并不明白,但是我举了个例子,惊讶的发现完全吻合

“-”代表了负无穷,-100是指负无穷加上100,最后因为只要dp[zone]所以第二个例子我就没有打完了

我们可以看到,最终的dp[zone]会因为我们的初始化的不一样而有所不同,希望能通过我这个例子给大家一个理解上的帮助。