直接放别人简单易懂的总结,比我自己描述得好
代码随想录 (programmercarl.com)
崔添翼 (Tianyi Cui) 背包问题九讲 2.0 beta1.2 - jggnice! - 博客园 (cnblogs.com)
1.01背包
优化成一维就是利用之前上一维计算出来的数据,在不损害后面还要用的上一维数据的情况下覆盖上一维的数据,做到把二维化简成一维。
为什么一维dp内层循环从后往前:因为转移方程可以看到Fi,v的状态需要从Fi-1,v 或者Fi-1,v-Ci 转化过来,所以,计算i行第v个需要j之前的数据(v-Ci),如果内层从前往后遍历,实际上取的值是此轮循环计算出来的Fi,v-Ci而不是上一轮数据Fi-1,v-Ci ,(当然这个Fi,v-Ci实际推导也是错的),所以内层循环要从后往前算,这样计算Fi,v不需要 后面的数据,所以没用了可以放心覆盖掉。
这一段我没能理解,待解释
Tips.初始化
2.完全背包
每个物品无限可取,所以计算每个状态要判断每一个物品放几个合适的问题,要搜索一下。从取0个i物品到完全放不下。 但是可以看到复杂度太高,看成n3
Tips:优化剪枝
区别:
01的二维,先遍历物品还是先遍历容量都可以
01的一维,必须先遍历物品
完全的一维,先遍历物品还是先遍历容量都可以
为什么?因为首先我们的推导公式告诉我们,01的二维和完全的一维他的推导都是从前往后的,
意味着从左上角推导到右下角,所以只要前面的状态算出来就行。
而01的一维必须从后面开始算,如果你先遍历容量,那这样需要的前置状态会不会被物品i改变?