蓝桥杯C++基础算法-多重背包

这段代码实现了一个多重背包问题的动态规划解法。多重背包问题与完全背包问题类似,但每个物品有其数量限制。以下是代码的详细思路解析:


1. 问题背景

给定 n 个物品,每个物品有其体积 v[i]、价值 w[i] 和数量 s[i],以及一个容量为 m 的背包。目标是选择物品使得总价值最大,同时总容量不超过背包的容量。与完全背包问题不同的是,多重背包问题中每个物品的数量是有限的。

2. 动态规划的概念

动态规划是一种常用的算法技巧,用于解决具有重叠子问题和最优子结构的问题。在多重背包问题中,动态规划通过维护一个二维数组 f 来记录不同状态下的最大价值。

3. 代码逻辑解析

(1) 输入数据
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i] >> w[i] >> s[i];
  • 用户输入物品数量 n 和背包容量 m

  • 对于每个物品,输入其体积 v[i]、价值 w[i] 和数量 s[i]

(2) 动态规划状态转移
for (int i = 1; i <= n; i++)for (int j = 0; j <= m; j++)for (int k = 0; k <= s[i] && k * v[i] <= j; k++)f[i][j] = max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k);
  1. 外层循环

    • 遍历每个物品,从第 1 个到第 n 个。

  2. 中层循环

    • 遍历背包的每个容量,从 0 到 m

  3. 内层循环

    • 遍历每个物品可以被选择的次数 k,从 0 到 s[i](即当前物品的最大数量),并且确保 k * v[i] <= j(即当前容量可以容纳的最大次数)。

  4. 状态转移

    • f[i][j] 表示前 i 个物品在容量为 j 的背包下的最大价值。

    • 不选择第 i 个物品f[i][j] = f[i - 1][j],即前 i-1 个物品在容量为 j 的背包下的最大价值。

    • 选择第 i 个物品 k:更新 f[i][j]f[i - 1][j - v[i] * k] + w[i] * k,即前 i-1 个物品在容量为 j - v[i] * k 的背包下的最大价值加上第 i 个物品的价值乘以选择次数 k

(3) 输出结果
cout << f[n][m] << endl;
  • 输出最终的最大价值,即 f[n][m]

4. 代码效率分析

  • 时间复杂度

    • 三层循环遍历所有物品、所有容量和所有选择次数,时间复杂度为 O(n × m × s_max),其中 s_max 是最大的物品数量。

  • 空间复杂度

    • 使用了一个二维数组 f,空间复杂度为 O(n × m)

5. 示例运行

输入:
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出:
10

6. 总结

这段代码的核心思路是通过动态规划解决多重背包问题。通过维护一个二维数组 f,记录不同状态下的最大价值,并通过状态转移方程更新最大价值,最终找到在给定背包容量下的最大价值。这种方法的时间复杂度为 O(n × m × s_max),空间复杂度为 O(n × m),适用于中等规模的多重背包问题。

完整代码

#include<bits/stdc++.h>
using namespace std;// 定义常量 N 作为数组的最大长度
const int N = 110;
// n 表示物品的种类数,m 表示背包的容量
int n, m;
// v 数组存储每种物品的体积,w 数组存储每种物品的价值,s 数组存储每种物品的数量上限
int v[N], w[N], s[N];
// f 数组是二维数组,f[i][j] 表示前 i 种物品,背包容量为 j 时能获得的最大价值
int f[N][N];int main()
{// 输入物品的种类数 n 和背包的容量 mcin >> n >> m;// 循环读入每种物品的体积、价值和数量上限for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i] >> s[i];// 动态规划过程,外层循环遍历每种物品for(int i = 1; i <= n; i ++)// 中层循环遍历背包的所有可能容量for(int j = 0; j <= m; j ++)// 内层循环枚举当前物品 i 放入的数量 k,k 要满足不超过该物品的数量上限 s[i] 且放入 k 个物品后的体积不超过当前背包容量 jfor(int k = 0; k <= s[i] && k * v[i] <= j; k ++)// 比较当前记录的最大价值 f[i][j] 和放入 k 个第 i 种物品后的价值// 放入 k 个第 i 种物品后,剩余容量为 j - v[i] * k,之前 i - 1 种物品在该剩余容量下的最大价值为 f[i - 1][j - v[i] * k]// 放入 k 个第 i 种物品的价值为 w[i] * kf[i][j] = max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k);// 输出前 n 种物品,背包容量为 m 时能获得的最大价值cout << f[n][m] << endl;return 0;
}

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

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

相关文章

【SUNO】【AI作词】【提示词】

仿写歌词提示词模板&#xff08;升级版&#xff09; 一、仿写目标 风格定位 音乐风格&#xff1a; [填写目标风格&#xff0c;如&#xff1a;民谣/流行/古风/电子/爵士等]参考案例&#xff1a;如《成都》的叙事民谣&#xff0c;《孤勇者》的励志流行。 情感基调&#xff1a; […

26考研——树与二叉树_树与二叉树的应用(5)

408答疑 文章目录 三、树与二叉树的应用哈夫曼树和哈夫曼编码哈夫曼树的定义概念带权路径长度&#xff08;WPL&#xff09;计算示例分析 哈夫曼树的构造算法描述哈夫曼树的性质示例 哈夫曼编码Huffman树的编码规则Huffman树的构建过程前缀编码前缀编码的分析及应用 Huffman树的…

【VUE】day06 动态组件 插槽 自定义指令 ESlint

【VUE】day06 动态组件 & 插槽 & 自定义指令 1. 动态组件1.1 通过不同的按钮展示不同的组件1.1.1回顾click 1.2 keep-alive的使用1.3 keep-alive对应的生命周期函数1.3.1 keep-alive的include属性1.3.2 exclude 1.4 组件注册名称和组件声明时name的区别1.4.1 组件声明时…

nodejs-原型污染链

还是老规矩&#xff0c;边写边学&#xff0c;先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…

Oracle 数据库通过exp/imp工具迁移指定数据表

项目需求&#xff1a;从prod数据库迁移和复制2个表(BANK_STATE&#xff0c;HBS)的数据到uat数据库环境。 数据库版本&#xff1a;Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 迁移工具&#xff1a;客户端exp/imp工具 -- 执行命令 从Prod数据库导出数据exp us…

企业级基于SpringBoot的MQTT的构建和使用

基于SpringBoot的MQTT配置及使用 首先要使用EMQX搭建一个MQTT服务器&#xff0c;参考文档&#xff1a;EMQX快速开始 本着开源分享的观点&#xff0c;闲话不多说&#xff0c;直接上代码 导入Maven <dependency><groupId>org.springframework.integration</gro…

26考研——图_图的代码实操(6)

408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…

开源webmail邮箱客户端rainloop的分支版本SnappyMail 设置发件人允许多重身份

RainLoop已多年未更新&#xff0c;SnappyMail 是 RainLoop 的分支&#xff0c;由社区维护。SnappyMail 不仅修复了漏洞&#xff0c;还增加了更多功能和优化。对 IMAP 支持更好&#xff0c;移动端体验也比 RainLoop 更细致。 安装过程和设置跟RainLoop一样&#xff1a; 以宝塔面…

海量数据场景题--查找两个大文件的URL

查找两个大文件共同的URL 给定 a、b 两个文件&#xff0c;各存放 50 亿个 URL&#xff0c;每个 URL 各占 64B&#xff0c;找出 a、b 两个文件共同的 URL。内存限制是 4G。 操作逻辑&#xff1a; 使用哈希函数 hash(URL) % 1000​ 将每个URL映射到0-999的编号 文件A切割为a0, a1…

简单ELK框架搭建

简介 ELK 框架是一套开源的日志管理和分析工具&#xff0c;由 Elasticsearch、Logstash 和 Kibana 三个主要组件组成&#xff0c;现在新增了Filebeat组件&#xff0c;可以更高效的收集数据。 Elasticsearch&#xff1a;是一个分布式、高可扩展的开源搜索引擎&#xff0c;能快速…

VS Code 中 .history`文件的来源与 .gitignore`的正确使用

引言 在使用 VS Code 进行 Git 版本控制时&#xff0c;有时会发现项目中多出一个 .history 目录&#xff0c;并被 Git 识别为未跟踪文件。本文将解释 .history 的来源&#xff0c;并提供 .gitignore 的正确配置方法&#xff0c;确保开发环境的整洁性。 1. .history 文件的来源…

网络之数据链路层

数据链路层 数据链路层目标 TCP/IP提供了一种能力, 将数据可靠的从 B 跨网络送到 C 主机, 这期间是由无数次局域网转发构成的, 比如 主机B 到 路由器F 就是一次局域网通信的问题, 而数据链路层就是研究数据是如何在局域网内部转发的. 也就是说, 应用层是进行数据的处理, 传输…

A Brief History: from GPT-1 to GPT-3

This is my reading notes of 《Developing Apps with GPT-4 and ChatGPT》. In this section, we will introduce the evolution of the OpenAI GPT medels from GPT-1 to GPT-4. GPT-1 In mid-2018, OpenAI published a paper titled “Improving Language Understanding …

基于大数据的各品牌手机销量数据可视化分析系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;各品牌手机销量数据可视化分析系统当然不能排除在外。基于大数据的各品牌手机销量数据可视化分析系统是在实际应用和软件工程的开发原理之…

人工智能-群晖Docker部署DB-GPT

人工智能-群晖Docker部署DB-GPT 0 环境及说明1 获取dbgpt的docker镜像2 下载向量模型3 下载配置文件4 修改配置文件5 创建dbgpt容器并运行6 访问dbgpt0 环境及说明 环境项说明DSM版本DSM 7.2.1-69057 update 3Container Manager版本24.0.2-1535当前 hub.docker.com 镜像仓库中的…

Netty——TCP 粘包/拆包问题

文章目录 1. 什么是 粘包/拆包 问题&#xff1f;2. 原因2.1 Nagle 算法2.2 滑动窗口2.3 MSS 限制2.4 粘包的原因2.5 拆包的原因 3. 解决方案3.1 固定长度消息3.2 分隔符标识3.3 长度前缀协议3.3.1 案例一3.3.2 案例二3.3.3 案例三 4. 总结 1. 什么是 粘包/拆包 问题&#xff1f…

JavaScript Fetch API

简介 fetch() API 是用于发送 HTTP 请求的现代异步方法&#xff0c;它基于 Promise&#xff0c;比传统的 XMLHttpRequest 更加简洁、强大 示例 基本语法 fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > con…

UMI-OCR Docker 部署

额外补充 Docker 0.前置条件 部署前&#xff0c;请检查主机的CPU是否具有AVX指令集 lscpu | grep avx 输出如下即可继续部署 Flags: ... avx ... avx2 ... 1.下载dockerfile wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Do…

C++ --- 二叉搜索树

1 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: 1 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 2 若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结点…

跨语言语言模型预训练

摘要 最近的研究表明&#xff0c;生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中&#xff0c;我们将这一方法扩展到多种语言&#xff0c;并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型&#xff08;XLM&#xff09;的方法&#xff1a;一种…