选择问题的状态表示一般都是 f[i][j] , i表示在前i个物品中选择,j一般表示体积不超过j;
-
01背包:
状态转移方程:f[i][j] = max(f[i-1][j] , f[i-1][j-v[i]] + w[i]);
发现计算f[i][j]只需要第i-1层的数据,可以利用滚动数组转换为一维:
f[j] = max(f[j] , f[j-v[i] + w[i]);
注意:
这里更新f[j]要从大到小更新 -
完全背包问题:
状态转移方程:f[i][j] = max(f[i-1][j] , f[i][j-v[i]] + w[i]);
同样可以转换为一维:
f[j] = max(f[j] , f[j-v[i]] + w[i]);
注意:
这里更新f[j]要从小到大;(因为f[j]要用到更新后的f[j-v[i]]) -
多重背包问题:
状态转移方程:f[i][j] = max(f[i-1][j] , f[i-1][j-v[i]k] + w[i]k);
其中k要满足:k<s[i] , k*v[i] < j;
即满足k不超过i的数量,以及不超过当前背包的体积 -
分组背包问题:
状态转移方程: f[i][j] = max(f[i][j] , f[i-1][j-v[i][k]] + w[i][k]);