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

博客详细探讨了0-1背包问题的动态规划解决方案,包括未优化和使用滚动数组优化的空间复杂度降低方法。通过逆序遍历避免了更新上一层状态的问题,并解释了为何需要逆序。文章还提供了优化前后的C++代码示例,适合理解动态规划模板和0-1背包问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果只看为什么要逆序,请直接下拉至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:优化前---------------------------------------------------

#
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值