当前位置: 首页 > article >正文

蓝桥杯C++基础算法-0-1背包

这段代码实现了一个经典的0-1 背包问题的动态规划解法。0-1 背包问题是指给定一组物品,每个物品有其体积和价值,要求在不超过背包容量的情况下,选择物品使得总价值最大。以下是代码的详细思路解析:


1. 问题背景

给定 n 个物品,每个物品有其体积 v[i] 和价值 w[i],以及一个容量为 m 的背包。目标是选择物品使得总价值最大,同时总容量不超过背包的容量。

2. 动态规划的概念

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

3. 代码逻辑解析

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

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

(2) 动态规划状态转移
for (int i = 1; i <= n; i++)for (int j = 0; j <= m; j++){f[i][j] = f[i - 1][j];  // 不选择第 i 个物品if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);  // 选择第 i 个物品}
  1. 外层循环

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

  2. 内层循环

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

  3. 状态转移

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

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

    • 选择第 i 个物品:如果当前容量 j 大于等于第 i 个物品的体积 v[i],则可以考虑选择第 i 个物品,更新 f[i][j]f[i - 1][j - v[i]] + w[i],即前 i-1 个物品在容量为 j - v[i] 的背包下的最大价值加上第 i 个物品的价值。

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

4. 代码效率分析

  • 时间复杂度

    • 两层循环遍历所有物品和所有容量,时间复杂度为 O(n × m)

  • 空间复杂度

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

5. 示例运行

输入:
3 5
1 2
2 3
3 4
运行过程:
  1. 输入数据

    • n = 3, m = 5

    • v = [1, 2, 3], w = [2, 3, 4]

  2. 动态规划状态转移

    • 初始化 f[0][j] = 0,表示没有物品时的最大价值为 0。

    • 对于第 1 个物品:

      • f[1][0] = 0

      • f[1][1] = 2

      • f[1][2] = 2

      • f[1][3] = 2

      • f[1][4] = 2

      • f[1][5] = 2

    • 对于第 2 个物品:

      • f[2][0] = 0

      • f[2][1] = 2

      • f[2][2] = 3

      • f[2][3] = 5

      • f[2][4] = 5

      • f[2][5] = 5

    • 对于第 3 个物品:

      • f[3][0] = 0

      • f[3][1] = 2

      • f[3][2] = 3

      • f[3][3] = 5

      • f[3][4] = 6

      • f[3][5] = 7

输出:
7

6. 总结

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

完整代码

#include<bits/stdc++.h>
using namespace std;// 定义数组的最大长度
const int N = 1010;
// n 表示物品的数量,m 表示背包的容量
int n, m;
// v 数组存储每个物品的体积,w 数组存储每个物品的价值
int v[N], w[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];// 动态规划过程,外层循环遍历每个物品for(int i = 1; i <= n; i ++)// 内层循环遍历背包的所有可能容量for(int j = 0; j <= m; j ++){// 不选择第 i 个物品,那么前 i 个物品在容量为 j 的背包中的最大价值// 就等于前 i - 1 个物品在容量为 j 的背包中的最大价值f[i][j] = f[i - 1][j];// 如果当前背包的容量 j 大于等于第 i 个物品的体积 v[i]// 说明可以选择放入第 i 个物品if(j >= v[i]) // 比较不放入第 i 个物品和放入第 i 个物品两种情况下的最大价值// 放入第 i 个物品的价值为 f[i - 1][j - v[i]] + w[i]f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);}// 输出前 n 个物品,背包容量为 m 时能获得的最大价值cout << f[n][m] << endl;return 0;
}

相关文章:

蓝桥杯C++基础算法-0-1背包

这段代码实现了一个经典的0-1 背包问题的动态规划解法。0-1 背包问题是指给定一组物品&#xff0c;每个物品有其体积和价值&#xff0c;要求在不超过背包容量的情况下&#xff0c;选择物品使得总价值最大。以下是代码的详细思路解析&#xff1a; 1. 问题背景 给定 n 个物品&am…...

常见中间件漏洞攻略-Jboss篇

一、CVE-2015-7501-Jboss JMXInvokerServlet 反序列化漏洞 第一步&#xff1a;开启靶场 第二步&#xff1a;访问该接口&#xff0c;发现直接下载&#xff0c;说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 http://47.103.81.25:8080/invoker/JMXInvokerServlet 第三步&…...

quartz.net条件执行

quartz.net条件执行 在使用Quartz.NET时&#xff0c;你可能需要基于某些条件来决定是否执行一个任务。Quartz.NET本身并不直接支持基于条件执行任务的功能&#xff0c;但你可以通过一些策略来实现这一需求。下面是一些方法来实现基于条件的任务执行&#xff1a; 1. 使用触发器…...

docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型

系统&#xff1a;没有限制&#xff0c;可以运行docker就行 磁盘空间&#xff1a;至少预留50GB; 内存&#xff1a;8GB docker版本&#xff1a;4.38.0 桌面版 下载ollama镜像 由于docker镜像地址&#xff0c;网络不太稳定&#xff0c;建议科学上网的一台服务器拉取ollama镜像&am…...

java TCP UDP 客户端访问例子和对比差异

Java TCP客户端示例 import java.io.*; import java.net.*;public class TCPClient {public static void main(String[] args) {try (Socket socket new Socket("localhost", 12345); // 连接服务端PrintWriter out new PrintWriter(socket.getOutputStream(), t…...

两个还算好用的ppt转word和PDF转word的python脚本

PPT转word&#xff1a; import re from pptx import Presentation from docx import Document from docx.shared import Inches from io import BytesIO from PIL import Imagedef clean_text(text):# 使用正则表达式删除控制字符和NULL字节return re.sub(r[\x00-\x1F\x7F], ,…...

opencascade 源码学习 XmlDrivers-XmlDrivers

OpenCASCADE 中的 XmlDrivers 是用于处理 XML 格式的 CAD 数据持久化模块&#xff0c;属于 OCAF&#xff08;Open CASCADE Application Framework&#xff09; 的一部分。它允许将 OCAF 文档&#xff08;包含 CAD 数据、属性、关系等&#xff09;序列化为 XML 文件&#xff0c;…...

Java-模块二-1

print和println print 和 println 是两种常用的输出方法&#xff0c;主要用于在控制台上打印信息。它们的行为因编程语言而异&#xff0c;但通常具有以下特点&#xff1a; Java中的print和println System.out.print()&#xff1a;此方法用于打印输出内容到控制台&#xff0c;…...

k8s--集群内的pod调用集群外的服务

关于如何让同一个局域网内的Kubernetes服务的Pod访问同一局域网中的电脑上的服务。 可能的解决方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs&#xff0c;或者直接使用Pod网络。每种方法都有不同的适用场景&#xff0c;需要逐一分析。 例如&…...

AI比人脑更强,因为被植入思维模型【20】卡尼曼双系统理论

定义 卡尼曼双系统理论思维模型是由诺贝尔经济学奖得主丹尼尔卡尼曼提出的&#xff0c;该理论认为人类的思维系统可以分为两个相互关联但又具有不同特点的子系统&#xff0c;即系统1&#xff08;快思考&#xff09;和系统2&#xff08;慢思考&#xff09;。系统1是基于直觉、经…...

ccfcsp3302相似度计算

//相似度计算 #include<iostream> #include<set>//不重复 #include<string> using namespace std; int main() {int n, m;cin >> n >> m;set<string>str1;set<string>str2;for(int i0;i<n;i){string s;cin>>s;for(int j0;…...

jEasyUI 创建 RSS 阅读器

jEasyUI 创建 RSS 阅读器 引言 随着互联网的快速发展&#xff0c;信息量呈爆炸式增长。为了方便用户快速获取所需信息&#xff0c;RSS 阅读器应运而生。jEasyUI 是一款流行的前端框架&#xff0c;具有丰富的组件和便捷的开发体验。本文将介绍如何使用 jEasyUI 创建一个功能齐…...

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具&#xff0c; DeepSeek:DeepSeek Kimi: Kimi - 会推理解析&#xff0c;能深度思考的AI助手 1、提示词&#xff1a; 你能帮我生成一个知识图谱吗&#xff0c;等一下我会给你一篇文章&#xff0c;帮我从内容中提取关键要素&#xff0c;然后以N…...

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…...

windows 平台编译openssl

文章目录 准备环境安装perl安装NASM获取源码 源码编译配置编译 准备环境 安装perl 下载Perl 5.40.0.1 Portable zip strawberryperl 解压后设置系统环境变量 测试安装是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…...

剑指小米特斯拉:秦L EV上市11.98万起

3月23日&#xff0c;比亚迪王朝网推出全新中级纯电轿车秦L EV&#xff0c;价格区间为11.98万-13.98万元&#xff0c;瞬间火爆市场。 依托e平台3.0 Evo技术赋能&#xff0c;秦L EV以“国潮设计、智能座舱、越级空间、高效安全、高阶智驾”五大核心优势&#xff0c;直击年轻用户痛…...

避雷 :C语言中 scanf() 函数的错误❌使用!!!

1. 返回值说明 scanf函数会返回成功匹配并赋值的输入项个数&#xff0c;而不是返回输入的数据。 可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符&#xff0c;就表明输入存在问题。 #include <stdio.h>int main() {int num;if (scanf("%d", …...

Godot读取json配置文件

概述 在Godot 4.3中读取JSON配置文件&#xff0c;可以通过以下步骤实现&#xff1a; 步骤说明 读取文件内容&#xff1a;使用FileAccess类打开并读取JSON文件。 解析JSON数据&#xff1a;使用JSON类解析读取到的文本内容。 错误处理&#xff1a;处理文件不存在或JSON格式错…...

Hadoop 3.x中的zookeeper和JournalNode的作用

在Hadoop 3.x版本中,ZooKeeper 和 JournalNode 的作用有所变化和增强,尤其是在HDFS高可用性(HA)架构和其他Hadoop组件的协作方面。下面是它们在Hadoop 3.x中的具体作用: ZooKeeper 继续在Hadoop 3.x中为集群提供协调服务,尤其是在HDFS的高可用性和YARN资源管理器的管理中…...

蓝桥杯高频考点——并查集(心血之作)

并查集 TA Can Do What & why learningwhatwhy 原理和结构路径压缩例题讲解题解solution 1&#xff08;50分&#xff09;solution 2&#xff08;100分&#xff09; 按秩(树高)合并按大小合并 TA Can Do What & why learning 从字面意思上来理解就是&#xff0c;合并&a…...

基于概率图模型的蛋白质功能预测

标题:基于概率图模型的蛋白质功能预测 内容:1.摘要 蛋白质功能预测在生物学研究中具有重要意义&#xff0c;能够帮助理解生命过程和疾病机制。本研究的目的是利用概率图模型进行蛋白质功能预测。方法上&#xff0c;收集了大量已知功能的蛋白质数据构建数据集&#xff0c;运用贝…...

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…...

Redisson 分布式锁原理

加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey&#xff0c;itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…...

高频SQL50题 第四天 | 1251. 平均售价、620. 有趣的电影、1075. 项目员工 I、1633. 各赛事的用户注册率

知识点导览&#xff1a;日期大小比较&#xff1b;ifnull(字段&#xff0c;默认值)函数&#xff1b;取余操作&#xff1b;字符串比较like&#xff1b;逆序desc 1251. 平均售价 题目链接&#xff1a;https://leetcode.cn/problems/average-selling-price/description/?envTypest…...

【STM32】SPI通信外设硬件SPI读写W25Q64

SPI通信协议和W25Q64存储器芯片解读笔记&#xff1a; 【STM32】SPI通信协议&W25Q64Flash存储器芯片&#xff08;学习笔记&#xff09;-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&…...

风暴潮、潮汐潮流模拟:ROMS模型如何精准预测海洋现象?

海洋数值模拟的崛起与 ROMS 的关键角色 &#x1f30a;在海洋科学的浪潮中&#xff0c;海洋数值模拟正以迅猛之势崛起&#xff0c;成为科研与实际应用领域不可或缺的利器。ROMS&#xff08;Regional Ocean Modeling System&#xff09;作为其中的佼佼者&#xff0c;凭借其高效、…...

Spring JDBC Template与事务管理:基于XML与注解的实战指南

摘要 本文深入解析Spring JDBC Template与事务管理的核心技术&#xff0c;结合XML配置与注解方式两种主流方案&#xff0c;通过转账案例完整演示数据库操作与事务管理的最佳实践。文章涵盖JDBC Template的核心用法、事务配置语法、常见问题及性能优化建议&#xff0c;帮助开发…...

【Keil5-开发技巧】

Keil5-开发技巧 ■ Keil5利用AStyle插件格式化代码第一步:下载AStyle插件第二步:添加AStyle插件第三步:AStyle插件介绍■ 一键转UTF-8编码■ Keil5利用AStyle插件格式化代码 第一步:下载AStyle插件 AStyle下载 第二步:添加AStyle插件 解压后 astyle-3.6.7-x64 在重命…...

Uniapp:基于 Vue.js 的高效跨平台开发框架

Uniapp 介绍 Uniapp&#xff08;全称&#xff1a;Universal Application&#xff09;是一款基于 Vue.js 的跨平台开发框架&#xff0c;由 DCloud 公司开发和维护。它允许开发者使用一套代码同时构建运行在多个平台&#xff08;如 iOS、Android、Web、小程序、快应用等&#xf…...

form 表单内容序列化成一个字符串

html <form id"form1" action"http://localhost:8080/xxx" method"post"> <p >关键字1&#xff1a; <input type "text" name"keyword1" /></p> <p >关键字2&#xff1a; <input t…...