[AcWing] 2. 01背包问题(C++实现)0-1背包问题模板题
如果只看为什么要逆序,请直接下拉至3. 解法
后附的可能存在的问题
.
在3. 解法
后附的可能存在的问题
,我给出了一个实例,可以清楚地看到,为什么正序会影响上一层的结果,而为什么逆序不会影响上一层的结果。
1. 题目
2. 读题(需要重点注意的东西)
思路:
闫式dp分析法
用闫式dp分析法分析0-1背包问题
未进行优化
能不能进行优化?
①
由于 i 这一层只与 i - 1 这一层有关,则可以使用滚动数组来优化空间复杂度,仅保留上一层结果即可,这样就能将其优化为一维:
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j > v[i]) f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
但是此时,我们相当于用的是 f [ i ] f [ j - v[ i ] ]的状态,而并非 f [ i - 1] f [ j - v[ i ] ]的状态,因为 f [ i ] 把 f [ i - 1]的状态更新了。
②
因此,我们要想使用上一层的 j - v[i],就需要把 j 逆序遍历。
for(int i = 0; i <= n; i++)
for(int j = m; j >= v[i]; j--)
f[j] = max(f[j], f[j-v[i]]+w[i]);
3. 解法
---------------------------------------------------解法1:优化前---------------------------------------------------
#