昨天学习了01背包,对于他的二维数组转一维数组不是很能够理解。
今天专门记录一下。
我们知道01背包的状态转移方程是
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]+w[i])
其中i表示第i个物品,j表示第i个物品放上去时当前背包的体积。
故j-v[i]表示的是i-1状态时背包占用的体积。
那为什么一维数组的状态转移方程是
f[j]=max(f[j],f[j-v[i]+w[i]))
(j从v到v[i])
呢?
里面的f[j]代表的是i状态下的体积是j,如何保证j-v[i]是i-1状态下的体积呢?
答案就是把j倒序,如果j是从最大体积到0的话,那么j-v[i]必定<j,即如果j-v[i]存在的话,必定不是i状态下的赋值。那么就是i-1状态下的赋值了f[j]=max(f[j],f[j-v[i]+w[i]))
(j从v到v[i])。意思就是i-1状态下体积为j这个状态,赋值到i状态下令其体积也是j,在一维数组上的表现形式其实是一致的。
关于初值的理解:
如果我们想求体积是v的最大值,要赋值的只有f[0] = 0,其他的都是负无穷
如果想求解的是体积小于等于v的最大值,应该赋值f[i] = 0,其余为负无穷