假设:给出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[][];