【算法】----多重背包问题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.穷不沾色,富不沾赌。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-524. 通过删除字母匹配到字典里最长单词

1、题目描述&#xff1a; 给你一个字符串 s 和一个字符串数组 dictionary &#xff0c;找出并返回 dictionary 中最长的字符串&#xff0c;该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个&#xff0c;返回长度最长且字母序最小的字符串。如果答案不存在&#x…

TikTok账户安全指南:如何取消两步验证?

TikTok账户安全指南&#xff1a;如何取消两步验证&#xff1f; 在这个数字化的时代&#xff0c;保护我们的在线账户安全变得尤为重要。TikTok&#xff0c;作为全球流行的社交媒体平台&#xff0c;其账户安全更是不容忽视。两步验证作为一种增强账户安全性的措施&#xff0c;虽…

面试题之箭头函数和普通函数有什么区别?

箭头函数&#xff08;Arrow Function&#xff09;和普通函数&#xff08;Regular Function&#xff09;是 JavaScript 中两种不同的函数定义方式&#xff0c;它们在语法、上下文&#xff08;this&#xff09;、原型链等方面存在显著区别。以下是它们的主要区别&#xff1a; 1. …

Llama 3.1 本地电脑部署 Linux系统 【轻松简易】

本文分享在自己的本地电脑部署 llama3.1&#xff0c;而且轻松简易&#xff0c;快速上手。 这里借助Ollama工具&#xff0c;在Linux系统中进行大模型部署~ Llama3.1&#xff0c;有三个版本&#xff1a;8B、70B、405B Llama 3.1 405B 是第一个公开可用的模型&#xff0c;在常识…

工业安全的智能哨兵:AI如何筑起生产线的“数字防火墙“

工业安全的智能哨兵:AI如何筑起生产线的"数字防火墙" (本文共1420字,阅读约需4分钟) 去年某石化厂的反应釜压力数据出现异常波动,传统监测系统在15分钟后才发出警报——而AI模型在23秒前就已预警。这场未遂事故揭示了一个残酷现实:工业安全监测正在经历从&qu…

【Bert】自然语言(Language Model)入门之---Bert

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 对bert进行梳理 论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 时间&#xff1a;…

Linux中使用Docker安装DIFY搭建本地支持库和Agent

Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员&#xff0c;也能参与到 AI 应用的定义和数据运营过程中。 然而…

开源工具推荐--思维导图、流程图等绘制

1. 前言 在工作中&#xff0c;经常要用到各种不同的工具&#xff0c;随着系统的升级&#xff0c;有些工具也在不断更新升级。这里收集整理一些好用的开源工具推荐&#xff0c;遵循以下一些基本原则&#xff1a;开源免费&#xff0c;商业工具的有效平替&#xff0c;轻量级&…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_create_pool函数

ngx_create_pool 声明在 src\core\ngx_palloc.h 中 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); 实现在 src\core\ngx_palloc.c 中 ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) {ngx_pool_t *p;p ngx_memalign(NGX_POOL_ALIGNMENT, size, lo…

ac的dhcp池里option43配错导致ap无法上线问题排查过程

dhcp池里ac地址配错&#xff0c;导致ap无法上线问题排查过程 问题&#xff1a;ap手动设置ac的ip正常注册在线&#xff0c;但dhcp获得ip和ac地址发现无法在ac上注册成功。 组网&#xff1a; ac旁路结构&#xff0c;路由器lan口地址172.16.1.1&#xff0c;开dhcp服务&#xff0…

IntelliJ IDEA中Maven配置全指南

一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文&#xff1a;环境配置 1.2 IDEA配置步骤 打开设置面板&#xff1a;File → Settings → Build → Build Tools → Maven 关键配置项&#xff1a; Maven home path E:\apache-maven-3.9.9 &#xff08;…

存储区域网络(SAN)管理

存储区域网络&#xff08;Storage Area Network&#xff0c;SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff09;技术&#xff0c;通过FC交换机连接存储阵列和服务器主机&#xff0c;建立专用于数据存储的区域网络。SAN提供了一种与现有LAN连…

使用vue-office报错TypeError: ft.createElementVNode is not a function

支持多种文件(.docx、.xlsx、.xls、.pdf、.pptx)预览的vue组件库&#xff0c;支持vue2/3。也支持非Vue框架的预览。 不支持.doc、.ppt&#xff08;2003年及以前的版本&#xff09; 官网&#xff1a;https://www.npmjs.com/package/vue-office/excel?activeTabreadme 官方有实…

Ubuntu部署ktransformers

准备工作 一台服务器 CPU&#xff1a;500G GPU&#xff1a;48G&#xff08;NVIDIA4090&#xff09; 系统&#xff1a;Ubuntu20.04&#xff08;github的文档好像用的是22.04&#xff09; 第一步&#xff1a;下载权重文件 1.下载hfd wget https://hf-mirror.com/hfd/hfd.s…

C++初阶——简单实现vector

目录 1、前言 2、Vector.h 3、Test.cpp 1、前言 简单实现std::vector类模板。 相较于前面的string&#xff0c;vector要注意&#xff1a; 深拷贝&#xff0c;因为vector的元素可能是类类型&#xff0c;类类型元素可以通过赋值重载&#xff0c;自己实现深拷贝。 迭代器失效…

全志A133 android10 适配SLM770A 4G模块

一&#xff0c;模块基本信息 1.官方介绍 SLM770A是美格智能最新推出的一款LTE Cat.4无线通讯模组&#xff0c;最大支持下行速率150Mbps及上行速率50Mbps。同时向下兼容现有的3G和2G网络&#xff0c;以确保即使在偏远地区也可以进行网络通信。 SLM770A模组支持分集接收和MIMO技…

微信小程序:多菜单栏设计效果

一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…

C++基础知识学习记录—string类

string实际上是C内置的一个类&#xff0c;内部对char *进行了封装&#xff0c;不用担心数组越界问题&#xff0c;string类中&#xff0c;除了上课讲解的函数外&#xff0c;还有很多函数可以使用&#xff0c;可以自行查阅文档。 构造函数原型&#xff1a; string(); //创建一个…

Ollama+DeepSeek+Open-WebUi

环境准备 Docker Ollama Open-WebUi Ollama 下载地址&#xff1a;Ollama docker安装ollama docker run -d \ -v /data/ollama/data:/root/.ollama \ -p 11434:11434 \ --name ollama ollama/ollama 下载模型 Ollama模型仓库 # 示例&#xff1a;安装deepseek-r1:7b doc…

设计模式--访问者模式【行为型模式】

设计模式的分类 我们都知道有 23 种设计模式&#xff0c;这 23 种设计模式可分为如下三类&#xff1a; 创建型模式&#xff08;5 种&#xff09;&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式&#xff08;7 种&#xff09;&#xff1…