完全背包
回顾一下
f[i][j] 所有只考虑前i个物品 且总体积不大于j的所有选法
当前种类的物品,“选了多少个”:
选0个,就是前面物品在当前体积下的最大价值:f[i-1][j];
选1个,前面物品在去掉当前1个物品体积的最大价值+当前1个物品的价值:f[i-1][j-1v[i]]+1w[i];
选2个,前面物品在去掉当前2个物品体积的最大价值+当前2个物品的价值:f[i-1][j-2v[i]]+2w[i];
不难能推导出 完全背包的动态转移方程 f[i,j]=f[i-1,j-v[i]*k]+w[i]*k (注意k有限制条件的)
将其展开
f[i,j]=max(f[i-1,j],f[i-1,j-v[i]]+W,f[i-1,j-2v[i]]+2W…)
f[i,j-v[i]]=max(f[i-1],j-v[i],f[i-1,j-2v]+w…)
两者相似 从第二项开始每项差一个w
所以f[i,j]=max(f[i-1,j],f[i,j-v]+w) 这样就不用枚举k了
这时我们便发现 二维完全背包和二维01背包非常的相似 其实唯一的区别就是
01背包 f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i])
完全背包 f[i][j]=max(f[i][j],f[i][j-v[i]]+w[i])
便于记忆
1 | #include<iostream> |
完全背包一维就非常简单了 从v[i]开始枚举 不用倒序 把第一维删掉即可
1 | #include<iostream> |
我们其实就能发现 一维的话 貌似除了枚举部分 其它都一样??
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hello Flu1t!