【算法】----多重背包问题I,II(动态规划)

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟
👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

文章目录

  • 前言
  • 多重背包问题
    • 二维多重背包
    • 一维多重背包
    • 优化版本
  • 最后


前言

今天我们接着上一篇博客继续学习背包问题:多重背包问题,这里将介绍完全背包问题的二维解法和一维解法以及优化版本,希望你可以喜欢。在这里插入图片描述——————————————————————————————

多重背包问题

多重背包问题是背包问题的一个变种。在这个问题中,每个物品有一个重量和一个价值,且可重复选择多次。背包有一个容量限制,问怎样选择物品可以使得背包中的总价值最大。

二维多重背包

对于二维多重背包问题,我们可以将其转化为一维多重背包问题来解决。具体来说,我们可以将第 i i i 个物品拆成 s i s_i si 个物品,每个物品的重量和价值都是原来的 w i s i \frac{w_i}{s_i} siwi v i s i \frac{v_i}{s_i} sivi。这样就将二维多重背包问题转化为了一维多重背包问题。

代码实现如下:

int dp[N];
for (int i = 1; i <= n; i++) {
    for (int j = m; j >= w[i]; j--) {
        for (int k = 1; k <= s[i] && k * w[i] <= j; k++) {
            dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]);
        }
    }
}

时间复杂度为 O ( n m ∑ i = 1 s v i ) O(nm\sum\limits_{i=1}^s v_i) O(nmi=1svi)

一维多重背包

对于一维多重背包问题,我们可以使用动态规划来解决。设 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示前 i i i 个物品中,容量为 j j j 的背包所能装下的最大价值。则有以下状态转移方程:

d p [ i ] [ j ] = max ⁡ { d p [ i − 1 ] [ j − k ⋅ w i ] + k ⋅ v i } ( 0 ≤ k ≤ ⌊ j w i ⌋ ) dp[i][j] = \max\{dp[i-1][j-k\cdot w_i]+k\cdot v_i\} \quad (0\leq k\leq \lfloor\frac{j}{w_i}\rfloor) dp[i][j]=max{dp[i1][jkwi]+kvi}(0kwij⌋)

其中 w i w_i wi 表示第 i i i 个物品的重量, v i v_i vi 表示第 i i i 个物品的价值。这个方程的意思是,我们可以选择第 i i i 个物品的 k k k 个,然后再加上前 i − 1 i-1 i1 个物品在剩余容量 j − k ⋅ w i j-k\cdot w_i jkwi 的情况下所能取得的最大价值。

代码实现如下:

int dp[N];
for (int i = 1; i <= n; i++) {
    for (int j = m; j >= w[i]; j--) {
        for (int k = 1; k * w[i] <= j && k <= s[i]; k++) {
            dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]);
        }
    }
}

时间复杂度为 O ( n m ∑ i = 1 s v i ) O(nm\sum\limits_{i=1}^s v_i) O(nmi=1svi)

优化版本

以上两种方法的时间复杂度都比较高,无法通过本题。我们需要对其进行优化。

观察上面的状态转移方程,我们可以发现其中有一个 max ⁡ \max max 函数,这个函数是比较耗时的。我们可以使用单调队列来优化这个 max ⁡ \max max 函数。具体来说,我们可以将 d p [ i − 1 ] [ j − k ⋅ w i ] + k ⋅ v i dp[i-1][j-k\cdot w_i]+k\cdot v_i dp[i1][jkwi]+kvi 放入一个单调队列中,然后取队首元素即可。

代码实现如下:

int dp[N];
deque<int> q;
for (int i = 1; i <= n; i++) {
    for (int j = 0; j < w[i]; j++) {
        q.clear();
        for (int k = 0; k * w[i] + j <= m; k++) {
            int x = k * w[i] + j;
            if (!q.empty() && k - q.front() > s[i]) {
                q.pop_front();
            }
            if (!q.empty()) {
                dp[x] = max(dp[x], dp[x - w[i]] + k * v[i]);
                while (!q.empty() && dp[x - w[i]] - q.back() * v[i] >= 0) {
                    q.pop_back();
                }
            }
            q.push_back(k);
        }
    }
}

时间复杂度为 O ( n m log ⁡ s ) O(nm\log s) O(nmlogs)


最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1. 努力读书,尤其是家境普通或者家境差的,去学习,你的目标就是改变自己的命运,骆家辉三代人才进白宫,英国印度裔首相苏纳克,三代人才进白金汉宫,所以有一代人必须做出付出,没办法,你的最大任务就是完成原始资本积累。

2.不要被别人牵着鼻子走,不要别人说什么就信什么,学会分辨是非。

3.不要随便把情绪写在脸上,冷静不代表软弱,理智不等于认怂。

4.我们不能一边过着糟糕的生活,一边期待好事发生在我们身上。

5.穷不沾色,富不沾赌。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973302.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超低失真、超高清晰度的远心工业镜头

随着机器视觉技术的不断提高&#xff0c;工业生产应用机器视觉系统也越来越广泛&#xff0c;大大提高的工厂的效率&#xff0c;而有时候采集的图像有些扭曲变形&#xff0c;也就是失真&#xff0c;图像失真又叫“畸变”&#xff0c;远心镜头就是为纠正传统工业镜头视差而设计一…

JWT认证机制

Session认证机制中需要配合cookie才能实现&#xff0c;由于cookie默认不支持跨域访问&#xff0c;当涉及到前端跨域请求后端接口时&#xff0c;需要做很多额外的配置&#xff0c;才能实现跨域session认证。所以这里不推荐使用session身份认证机制&#xff0c;一般推荐使用jwt认…

嵌入式八股文(四)计算机网络篇

第一章 基础概念 1. 服务 指网络中各层为紧邻的上层提供的功能调用,是垂直的。包括面向连接服务、无连接服务、可靠服务、不可靠服务。 2. 协议 是计算机⽹络相互通信的对等层实体之间交换信息时必须遵守的规则或约定的集合。⽹络协议的三个基本要素:语法、…

数据结构——单向循环链表、双链表、双向循环链表

目录 一、单向循环链表 1.1 单向循环链表的概念 1.2 单向循环链表的操作 1.2.1 单向循环链表的创建 1.2.2 单向循环链表的头插 1.2.3 单向循环链表的遍历 1.2.4 单向循环链表的头删 1.2.5 单向循环链表的尾插 1.2.6 单向循环链表的尾删 1.2.7 约瑟夫环 1.3 单向循环列表所有程…

dify安装

官网教程 https://github.com/langgenius/dify/blob/main/README_CN.md 1、下载源码 git clone https://github.com/langgenius/dify.git 2、进入docker目录 cd dify cd docker cp .env.example .env修改nginx对外端口配置 修改为9000 最后执行&#xff1a;docker compo…

使用Termux将安卓手机变成随身AI服务器(page assist连接)

通过以下方法在安卓手机上运行 Ollama 及大模型&#xff0c;无需 Root 权限&#xff0c;具体方案如下&#xff1a; 通过 Termux 模拟 Linux 环境运行 核心工具&#xff1a; 安装 &#xff08;安卓终端模拟器&#xff09;()]。借助 proot-distro 工具安装 Linux 发行版&#xf…

C++ STL中的reverse/unique/sort/lower_bound/upper_bound函数使用

本文主要涉及以下几个函数&#xff1a; reverse&#xff1a;反转序列。unique&#xff1a;移除相邻重复元素。sort&#xff1a;对序列进行排序。lower_bound 和 upper_bound&#xff1a;查找目标值的边界位置。头文件均为<algorithm> 1. reverse 功能&#xff1a;反转指…

QT QLabel加载图片等比全屏自适应屏幕大小显示

最近在工作项目中,遇到一个需求: 1.使用QLabel显示一张图片; 2.当点击这个QLabel时,需要全屏显示;但不能改变原来的尺寸; 3.当点击放大后的QLabel时,恢复原有大小. 于是乎,就有了本篇博客,介绍如何实现这样的功能. 一、演示效果 在一个水平布局中&#xff0c;添加两个Lable用…

C# 背景 透明 抗锯齿 (效果完美)

主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll&#xff0c;同时定义了一些结构体来配合这些 API 函数的使用&#xff0c;常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大&#xff0c;抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…

Windows10 将Docker虚拟磁盘文件ext4.vhdx迁移至D盘

今天打开电脑发现之前迁移到D盘的ext4.vdx居然占有80多个G不得不重新清理一下了 于是先删除了d盘的ext4.vdx文件 注销了原来的 wsl --unregister docker-desktopwsl --unregister docker-desktop-data 确认 WSL 发行版状态&#xff1a; 运行以下命令以确认当前的 WSL 发行版…

OpenCV二值化处理

1.1. 为什么需要二值化操作 二值化操作将灰度图像转换为黑白图像&#xff0c;即将图像中的像素值分为两类&#xff1a;前景&#xff08;通常为白色&#xff0c;值为 255&#xff09;和背景&#xff08;通常为黑色&#xff0c;值为 0&#xff09;。二值化的主要目的是简化图像&…

深入了解 DevOps 基础架构:可追溯性的关键作用

在当今竞争激烈的软件环境中&#xff0c;快速交付强大的应用程序至关重要。尽管如此&#xff0c;在不影响质量的情况下保持速度可能是一项艰巨的任务&#xff0c;这就是 DevOps 中的可追溯性发挥作用的地方。通过提供软件开发生命周期 &#xff08;SDLC&#xff09; 的透明视图…

由浅入深学习大语言模型RLHF(PPO强化学习- v1浅浅的)

最近&#xff0c;随着DeepSeek的爆火&#xff0c;GRPO也走进了视野中。为了更好的学习GRPO&#xff0c;需要对PPO的强化学习有一个深入的理解&#xff0c;那么写一篇文章加深理解吧。纵观网上的文章&#xff0c;要么说PPO原理&#xff0c;各种复杂的公式看了就晕&#xff0c;要…

【Java八股文】08-计算机网络面试篇

【Java八股文】08-计算机网络面试篇 计算机网络面试篇网络模型网络OSI模型和TCP/IP模型分别介绍一下键入网址到网页显示&#xff0c;期间发生了什么&#xff1f; 应用层- HTTP应用层有哪些协议&#xff1f;HTTP是什么及HTTP报文有哪些部分&#xff1f;HTTP是怎么传输数据的HTTP…

【Linux】Linux 文件系统——有关 inode 不足的案例

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周二了&#xff0c;明天星期三&#xff0c;还有三天就是星期五了&#xff0c;坚持住啊各位&#xff01;&#xff01;&#xff01;&#x1f606; 本文是对之前Linux文件权限中的inode号进行实例讨论&#xff0c;看到博客有错误…

SpringBoot整合Redis和Redision锁

参考文章 1.Redis 1.导入依赖 <!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.c…

亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!

作者&#xff1a;程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案&#xff0c;但是很多人表示还是用的不够爽&#xff0c;比如用CodeChat的方案&#xff0c;只支持V3版本&#xff0c;不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么&#xff0c;今天&#xff0c;给…

一周学会Flask3 Python Web开发-Debug模式开启

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况&#xff0c;项目开发是普通模式&#xff0c;也就是你修改了代码&#xff0c;必须重启项目&#xff0c;新代码才生效&…

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…

PyTorch 深度学习框架中 torch.cuda.empty_cache() 的妙用与注意事项

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在使用 PyTorch 进行深度学习模型训练与调优过程中&#xff0c;torch.cuda.empty_cache() 方法作为一种高效工具被广泛采用&#xff1b;但其正确应用要求充分理解该方法的功能及最佳实践。下文将对该方…