01背包及其优化
2015-08-18 09:26
253 查看
状态转移方程:
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)
这个优化之所以成立的原因请读者自己思考。(提示:使用二维的转移方程思
考较易。)
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)
这个优化之所以成立的原因请读者自己思考。(提示:使用二维的转移方程思
考较易。)
相关文章推荐
- 多线程实现多任务
- 【Python学习笔记】-生成激活码
- Linux SSH 免密码登录常见问题
- 图解linux下top命令的使用
- [书目20150818]给你个门店,你该怎么管?
- 5、继电器+LED(简单的io口)
- iOS中纯手工图片浏览器
- python换行
- MVC下获得服务器的IP地址
- win2012部署asp网站相关
- 算法竞赛入门经典:第七章 暴力求解法 7.13困难的串
- arm底板中linux程序的运行
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
- android下使用aapt命令测试启动时间
- Hibernate基础
- 鼠标控制旋转
- AlertDialog对话框按钮位置问题
- C# delegate
- 算法竞赛入门经典:第七章 暴力求解法 7.11回溯法
- 20150817