01背包问题
来源:互联网 发布:大数据平台性能指标 编辑:程序博客网 时间:2024/06/10 16:01
动态规划中很经典的问题,去年暑假集训的时候看过,下午又遇到了这种类型的题目,发现什么都不懂了,又翻看了之前的资料,就是陷入了一个坑里了,不明白对空间进行优化的要采用逆序,足足三个小时啊。。。我是不是太笨了???不过还好,终于理解了,我想应该也有不少童鞋跟我一样,就用自己的理解方式拿出来共享下
首先我们看未进行优化的时候的动态规划方程的推导过程。01背包是指有N件物品和一个容量为V的背包,每件物品只有一件,所占用的空间为cost[i],花费为w[i],求将这些物品放入背包中所能获得的最大的价值。
假设dp[i][v]表示第i件物品放入背包时获得的最大的价值,每件物品都可以选择放或者不放,故动态规划方程可以列成:dp[i][v]=max{dp[i-1][v],dp[i-1][v-cost[i]+w[i]} ,意思就是第I件物品不放 进去的总价值为dp[i-1][v],放进去的价值为dp[i-1][v-cost[i]]+w[i],比较两种情况下的最优解。
即对每件物品进行考虑,
for(i->n)
for(0->v)
dp[i][v]=max{dp[i-1][v],dp[i-1][v-cost[i]+w[i]};
考虑到空间可以从二维数组降低到一位数组,用dp[v]表示前i件物品放入背包的最大价值。i=0->n循环后dp[v]表示的就是最优解。
那么方程可表示为
dp[v]=max{dp[v],dp[v-cost[i]]+w[i]},
那么dp[v]怎么才能表示前一个状态的值呢?逆序,for(v->0),为什么?考虑到价值均为正值,体积大的时候的解是依赖于体积小的解的,而且每个物品只能放置一次,假设v1<v2,如果顺序循环的话,就会出现当更新dp[v2]时,加入了物品i,然后才循环到体积v2,就可能出现dp[v2]也会因为i加入出现更新,也就是在这个过程中i加入了两次,与01背包不符。逆序的话,当dp[v2]更新的时候dp[v1]还未出现更新,这时方程中后一个dp[v]就可以看成dp[i-1][v]了,dp[v]在优化后也就可以表示前一个状态了(体积小的)。
关于初始化问题的时候要考虑如下两种方式:
(1)刚好完全填满背包
这就要求当容量为0的时候,只能被价值为0的物品填满,即初始化为dp[0]=0;
(2)不要求刚好填满
也就是每一个体积的情况下都有一个有效解为0,所以初始化为dp[0...v]=0.
- 背包问题---01背包
- DP 背包问题 01背包
- 01背包--苹果,背包问题
- 01背包 完全背包问题
- 背包问题之01背包
- 背包问题之01背包
- 背包问题1:01背包
- 背包问题《1》01背包
- 01背包+完全背包问题
- 背包问题-背包01-苹果
- 背包问题之01背包
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 动态规划-----背包问题-----01背包,完全背包,多重背包
- 经典背包问题 01背包+完全背包+多重背包
- 背包(01背包、完全背包、多重背包)问题总结
- 背包问题(01背包,完全背包,多重背包)
- 经典背包问题 01背包+完全背包+多重背包
- 黑马程序员:银行业务调度系统
- css用边框实现圆角矩形
- SWT:充满式布局
- dp px互转
- Java I/O流操作(三)---File文件操作及打印流和序列流-合并流
- 01背包问题
- hdu4512 LCIS
- 修改EXE文件的图标
- sicp习题2.2
- 浅析http平台的安全稳定性架构
- 早餐必须吃鸡蛋的7个理由】
- NSIS 如何删除VISTA系统开始菜单的快捷方式
- SQL入门基础(一)
- 树莓派 交叉编译