为什么要倒叙遍历背包容量?为了保证每个物品只被添加一次
下面是正向遍历的情况:
原因:因为dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);dp[j]是通过比较自己与 dp[j - weight[i]] + value[i]的大小获得的,所以要先知道自己的大小,才能比较,所以才需要倒叙遍历。比如y=max(y,x),需要先知道y和x的大小,才能更新y;如果正向遍历y=max(y,x),x是跟上一个y加上物品的价值的,y就会越来越大,物品就被重复使用了。
为什么可以通过倒叙遍历获得前面的值?因为在初始化的时候,dp中的所有元素都初始化成了0,所以最后一个也是0 。比如刚开始dp[4]=0,遍历一次后,dp[4]=max(dp[4],dp[4-1]+15),其中dp[4]和dp[3]都为0,所以得到了dp[4]=15;再通过dp[4]来更新dp[3]的值,以此类推就可以获得所有dp的值,且每个物品都只选用了一次。