AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 7. 混合背包问题【混合背包DP模型】    原题链接    中等

作者: 作者的头像   一只野生彩色铅笔 ,  2021-06-18 11:24:32 ,  所有人可见 ,  阅读 5264


38


9

最近在补全提高课所有题目的题解,宣传一下汇总的地方提高课题解补全计划

题目描述

有 $n$ 种物品和一个 容量 为 $m$ 的背包

物品分三类:

  1. 第一类物品只能用 $1$ 次(01背包);
  2. 第二类物品可以用无限次(完全背包);
  3. 第三类物品最多只能用 $s_i$ 次(多重背包);

每种体积是 $v_i$,价值是 $w_i$

求解一个选物品的方案,是的物品 总体积 不超过背包的 容量,且 总价值最大

分析

该题就是一道 混合背包 的裸题

结合每个 物品 的属性,分别做不同的 状态转移 即可

可以结合 01背包、完全背包、多重背包 这三篇博客配套使用

此处的多重背包还要采用 二进制优化 变成多个 01背包 来做,不然会卡 TLE

闫氏DP分析法

IMG_B5C67A3846AE-1.jpeg

Code

时间复杂度:$O(n \times m \times \log s)$

空间复杂度:$O(m)$

#include <iostream>

using namespace std;

const int N = 1010;

int n, m;
int v[N], w[N], s[N];
int f[N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++ i) cin >> v[i] >> w[i] >> s[i];

    for (int i = 1; i <= n; ++ i)
    {
        //完全背包
        if (!s[i])
        {
            for (int j = v[i]; j <= m; ++ j)
            {
                f[j] = max(f[j], f[j - v[i]] + w[i]);
            }
        }
        else
        {
            //把多重背包用二进制优化
            //这样就变成做多个01背包了
            if (s[i] == -1) s[i] = 1;
            //二进制优化
            for (int k = 1; k <= s[i]; k *= 2)
            {
                for (int j = m; j >= k * v[i]; -- j)
                {
                    f[j] = max(f[j], f[j - k * v[i]] + k * w[i]);
                }
                s[i] -= k;
            }
            if (s[i])
            {
                for (int j = m; j >= s[i] * v[i]; -- j)
                {
                    f[j] = max(f[j], f[j - s[i] * v[i]] + s[i] * w[i]);
                }
            }
        }
    }

    cout << f[m] << endl;

    return 0;
}

8 评论


用户头像
有机物   2022-10-01 09:40      2    踩      回复

时间复杂度严谨来讲是:$\mathcal{O}(n \times m \times \sum \log_2 s_i)$

用户头像
Cplusplus   2023-04-30 18:25         踩      回复

完全背包下最多的物品数量为(总体积/单个物品的体积)


用户头像
雾里看花.   2022-08-12 14:31         踩      回复

orz


用户头像
小西   2022-06-10 20:40         踩      回复

时间复杂度为啥不是O(m*n)?


用户头像
gtt   2022-04-02 16:02         踩      回复

orz


用户头像
此账号已注消   2022-03-06 11:11         踩      回复

单调栈优化不行吗

用户头像
acw_yu   2022-06-09 13:39         踩      回复

可以的。只是二进制优化写着快点


用户头像
jiuzheyangba   2021-07-03 08:42         踩      回复

orz


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息