01背包问题-个人见解

假设:给出7个背包 

编号 背包体积w 价值v 

1:         2                3

2:         3                5

3:         4                7

4:         7              11

5:         4              50

6:         5              5

7:         4              4

dp[i][j]表示用j总容量的背包装下 前i个背包中的若干个背包 的最大价值

只考虑第i个背包能否装入问题,若能装入(条件:现有容量-第i个背包体积大于等于0)第i个背包,然后再用剩余容量装入前i-1个背包中的若干个背包。

dp[i][j]=max{dp[i][j],dp[i-1][j-w[i]]+v[i]}  

并且一定要再考虑第i个背包没有装入的情况,因为如下情况就说明:

例如:最大容量m=5,从1开始:dp[1][1]=0,dp[1][2]=3,dp[1][3]=3,dp[1][4]=3,dp[1][5]=3;

              2:       dp[2][1]=0;dp[2][2]=3; dp[2][3]=5;此时不背(背包2),那么答案是3,肯定选背起,背起后还剩下3-3=0容量,所以前面1个背包无法背起

dp[2][4]=5,同理,dp[2][5]=8,背起3后,容量剩余5-3=2,还可以背 起前2-1个背包中的(背包1),故答案为8

          好了3的情况我分析重点的 dp[3][5]=8,这里是选择不背第3个背包,而去选择背起前2个背包,就是这种情况,如果只考虑能背起第i个背包就背起,

那么dp[3][5]=7,剩余的1点容量它无法背起1,2背包,但是,现在我考虑上不背第i个背包情况,转去选择背起前i-1个背包中若干个背包

dp[3][5]=dp[2][5]=dp[2-1][5-w[2]]+5=dp[1-1][2-w[1]]+3+5=dp[0][0]+3+5;

每次计算dp[][]的时候只要考虑前一步也在考虑着同样的问题,所以肯定能找出最优解,即 上一级最优,那么在本级操作中也在考虑最优,实现次次都最优,最终得出一个最优序列dp[][];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值