[AcWing] 2. 01背包问题(C++实现)0-1背包问题模板题

[AcWing] 2. 01背包问题(C++实现)0-1背包问题模板题

  • 1. 题目
  • 2. 读题(需要重点注意的东西)
  • 3. 解法
  • 4. 可能有帮助的前置习题
  • 5. 所用到的数据结构与算法思想
  • 6. 总结

如果只看为什么要逆序,请直接下拉至3. 解法后附的可能存在的问题.
3. 解法后附的可能存在的问题,我给出了一个实例,可以清楚地看到,为什么正序会影响上一层的结果,而为什么逆序不会影响上一层的结果。

1. 题目

[AcWing] 2. 01背包问题(C++实现)0-1背包问题模板题_第1张图片

2. 读题(需要重点注意的东西)

思路:
闫式dp分析法
[AcWing] 2. 01背包问题(C++实现)0-1背包问题模板题_第2张图片


用闫式dp分析法分析0-1背包问题

未进行优化
[AcWing] 2. 01背包问题(C++实现)0-1背包问题模板题_第3张图片


能不能进行优化?


在这里插入图片描述
由于 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:优化前---------------------------------------------------

#

你可能感兴趣的:(AcWing算法日记,c++,动态规划,算法)