01背包的优化问题
通过不断的去模拟代码的运行 对背包问题有了更深的理解 sum[i][j]=max(sum[i-1][j],sum[i-1][j-x[i]]+v[i]); 实际上就是数据的不断更新过程 在上一子问题的基础上 对该子问题每个空间大小能放的最多价值进行更新 然后使用于下一个子问题 由于每个子问题都是最优解 最终得到的解就是最优解
下午的背包刚入手 用的是二维数组 有一定程度的浪费空间
对于一个子问题的每个空间对应的最佳价值 可以通过从高位到地位逆序的写法(下一个子问题求每个空间大小的最佳价值要使用的是上一个子问题此时的空间大小以及小于此时空间大小的最佳值) 采用逆序的写法 即照顾了只需要上一个子问题状态不被覆盖 有起到了节省空间的作用
附上代码
for(int i=1;i<=n;i++)
{
for(int j=v;j>=weight[i];j--)
{
f[j]=max(f[j],f[j-weight[i]]+value[i]);
}
}
v为背包空间