01背包及其优化

来源:互联网 发布:淘宝怎么收钱 编辑:程序博客网 时间:2024/06/01 14:00

状态转移方程:

f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]*v[i])

优化空间复杂度
以上方法的时间和空间复杂度均为O(VN),其中时间复杂度应该已经不能再优化了,但空间复杂度却可以优化到O(V)。
先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组F[i,0..V]的所有值。那么,如果只用一个数组F[0..V],能不能保证第i次循环结束后F[v]中表示的就是我们定义的状态F[i,v]呢?F[i,v]是由F[i−1,v]和F[i−1,v−Ci]两个子问题递推而来,能否保证在推F[i,v]时(也即在第i次主循环中推F[v]时)能够取用F[i−1,v]和F[i−1,v−Ci]的值呢?事实上,这要求在每次主循环中我们以v=V..0的递减顺序计算F[v],这样才能保证推F[v]时F[v−Ci]保存的是状态F[i−1,v−Ci]的值。伪代码如下:
F[0..V]=0

fori=1toN

forv=VtoCi
F[v]=max{F[v],F[v−Ci]+Wi}
其中的F[v]=max{F[v],F[v−Ci]+Wi}一句,恰就对应于我们原来的转移方程,因为现在的F[v−Ci]就相当于原来的F[i−1,v−Ci]。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了F[i,v]由F[i,v−Ci]推导得到,与本题意不符。

一个时间常数优化
上面伪代码中的

fori=1toN

forv=VtoCi
中第二重循环的下限可以改进。它可以被优化为
fori=1toN
forv=Vtomax(V−ΣNiWi,Ci)
这个优化之所以成立的原因请读者自己思考。(提示:使用二维的转移方程思
考较易。)

0 0
原创粉丝点击