背包dp传统做法
步骤:
1.状态表式:f[i][j] i为第几个物品,j为限制条件(意义:前i个物品再满足体积j的条件下的所有的选法的最大价值的集合)
2.状态计算:分为两个状态->选or不选。不选的话f[i][j]=f[i-1][j],选的话则f[i][j]=max(f[i][j],f[i-1][j-w[i]]+v[i])
背包dp优化做法:
步骤和上面一样,但是使用一维数组f[j]
将i-1用循环的特点替换掉,减少内存的占用
具体方法是:
for(int i=1;i<=(对象的数量);i++){
for(int j=(限制条件的最大值);j>=0;j--){
if(j>=w[i](w[i]实则是在这个选择下的某种花费)){
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
}