01背包
假如有承重5的背包,有1(重量)——3(价值)
有2——5,有3——7
0 1 2 3 4 5
0 0 0 0 0 0 0
1 0 3 3 3 3 3
2 0 3 5 8 8 8
3 0 3 5 8 10 12
大致就是填表,从上到下,从左到右,填表规则就是寻找该位置(物品和重量限制)能获得的最大价值。
如果背包重量小于物品,价值为前一物品价值
背包重量大于物品,价值为前一物品价值和拿完以后剩下重量的价值的最大值
n 为物品,t为重量,v为价值,a[] 为重量,v[][]为价值,t[]为时间
for(i = 1 ; i < n ; i++){
for( j = 1 ; j < t ; j ++){
if(j > a[i]) v[i][j] = v[i-1][j];
if(j <= a[i]) v[i][j] = max( v[i-1][j],v[i-1][j-t[i]] + v );}
}
还对其进行了优化(空间)
滚动(一维)
注意要从后往前进行推算(防止有前边有值改动,导致后边值不准确)