背包问题的核心是一条状态转移方程:我用zone表示背包的最大空间
j=w[i];j<=zone;j++
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
在这里,dp是存储最大价值的数组,其中i代表,现在正在考虑第几个物品,要知道,我们前面的i-1个物品已经都求解完毕并且存储起来了。
w[i]对应了第i件物品的重量(容积),v[i]对应了第i件物品的价值
在这里我觉得大家可以考虑把一开始的w和v数组进行小小的处理,从i=1开始接收数据,这样子初学的话比较好理解,要不然因为数组都是从0开始的,写dp的时候还要转一下弯。。。。。。这是笨笨的我的一点小体会hh,如果觉得ok那也是可以的
初值那就是dp[0][0]~dp[0][zone],全部赋值为0,这个也是很好理解的,因为这个dp数组就是说,我们现在没有任何物品,所以说,背包里面对应任何空间的最大价值和都是0。
有趣的地方来了
转移状态的体现
接下来我们考虑的是i=1的情况,但是根据我们之前状态转移方程,我会知道,我们把现在的这个问题转移到了i-1=0,即第0个物品,我们已经考虑过的状态。
我们对于一件物品,肯定是有两种选择,取还是不取,
取的话对应了dp[i-1][j-w[i]]+v[i]
不取对应了dp[i-1][j]
it means,在现在这个同样的空间限制下,哪一种取法,最max,最好。这是子结构的最优解
后面的i=2,i=3......都是这样子,你发现了吗,我们把一个问题,拆开了很多个小部分,每个小部分,我们只考虑一件物品的情况。我觉得这是非常非常有意思的,也是非常巧妙的。
但是,我个人对于我现有的这份资料有一点保留。。。。。。
-----未完待续。