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

【备战蓝桥杯】----01背包问题(动态规划)

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

文章目录


前言

今天我们来学习一下一个经典Dp问题----背包问题,这里将详细介绍背包问题的二维解法和一维解法。码字不易,请多多支持。在这里插入图片描述

——————————————————————————————

0-1背包问题

背包问题是一个经典的动态规划问题,其基本形式是:有一个容量为 VVV 的背包和 nnn 个物品,每个物品有一个体积 viv_ivi 和一个价值 wiw_iwi。要求选择若干物品装入背包,使得装入背包中物品的总价值最大。其中每个物品只能选择装入一次

二维解法

状态定义

f(i,j)f(i,j)f(i,j) 表示前 iii 个物品,体积不超过 jjj 的情况下可以获得的最大价值。

状态转移方程

对于第 iii 个物品,有两种选择:

  1. 不放入背包,此时背包的最大价值为 f(i−1,j)f(i-1,j)f(i1,j)
  2. 放入背包,此时背包的最大价值为 f(i−1,j−vi)+wif(i-1,j-v_i)+w_if(i1,jvi)+wi

因此,状态转移方程为:

f(i,j)=max⁡{f(i−1,j),f(i−1,j−vi)+wi}f(i,j)=\max\{f(i-1,j),f(i-1,j-v_i)+w_i\}f(i,j)=max{f(i1,j),f(i1,jvi)+wi}

详细讲解:

f数组:

在背包问题中,f数组一般表示状态转移方程中的“状态”,即f(i,j)f(i,j)f(i,j)表示在前iii个物品中,背包容量为jjj时的最大价值。也就是说,f(i,j)f(i,j)f(i,j)表示在当前背包容量为jjj的情况下,前iii个物品能够获得的最大价值。在动态规划中,我们需要通过状态转移方程来不断更新f(i,j)f(i,j)f(i,j)的值,最终得到背包问题的最优解。

f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);

这条语句是背包问题中的状态转移方程,表示在背包容量为 j 时,前 i 个物品能够获得的最大价值。

具体来说,f[i][j] 表示前 i 个物品,在背包容量为 j 时能够获得的最大价值。而根据背包问题的定义,第 i 个物品有两种选择,要么不装入背包,此时最大价值为 f[i-1][j];要么装入背包,此时最大价值为 f[i-1][j-v[i]] + w[i],其中 f[i-1][j-v[i]] 表示背包容量为 j-v[i] 时前 i-1 个物品的最大价值,w[i] 表示第 i 个物品的价值。因此,f[i][j] 就是这两种选择中的最大值。

代码实现

#include<bits/stdc++.h>using namespace std;const int MAXN = 1005;
int v[MAXN];    // 存储物品体积
int w[MAXN];    // 存储物品价值
int f[MAXN][MAXN];  // f[i][j]表示在背包容量为j的情况下,前i个物品的最大价值int main() 
{int n, m;   cin >> n >> m;  // 输入物品数量和背包容量// 输入每个物品的体积和价值for(int i = 1; i <= n; i++) cin >> v[i] >> w[i];// 动态规划求解for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++){// 当前背包容量装不下第i个物品,则最大价值为前i-1个物品的最大价值f[i][j] = f[i - 1][j];// 当前背包容量能够装下第i个物品,需要对是否选择第i个物品进行决策if(j >= v[i])   f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);}           cout << f[n][m] << endl;  // 输出最大价值return 0;
}

一维解法

状态定义

f(j)f(j)f(j) 表示体积不超过 jjj 的情况下可以获得的最大价值。

状态转移方程

对于第 iii 个物品,有两种选择:

  1. 不放入背包,此时背包的最大价值为 f(j)f(j)f(j)
  2. 放入背包,此时背包的最大价值为 f(j−vi)+wif(j-v_i)+w_if(jvi)+wi

因此,状态转移方程为:

f(j)=max⁡{f(j),f(j−vi)+wi}f(j)=\max\{f(j),f(j-v_i)+w_i\}f(j)=max{f(j),f(jvi)+wi}

详细解释:

int j = m; j >= v[i]; j–

这里的意思是从大到小枚举体积,因为在计算当前物品的最大价值时,需要用到之前物品的最大价值,而之前物品的最大价值可能已经被更新过,所以需要从大到小枚举体积,保证当前物品的体积不会影响之前物品的最大价值。同时,体积从大到小枚举也可以保证每个物品只被考虑一次,避免重复计算。

f[j] = max(f[j], f[j - v[i]] + w[i]);

在背包问题中,f[j]表示体积不超过j的情况下可以获得的最大价值。而f[j]的计算需要考虑两种情况:

  1. 不选第i个物品,此时f[j]的价值为f[j],即前i-1个物品的最大价值。
  2. 选第i个物品,此时f[j]的价值为f[j - v[i]] + w[i],即前i-1个物品在剩余容量为j - v[i]的情况下的最大价值加上第i个物品的价值w[i]。

因此,f[j]的值应该为这两种情况的最大值,即f[j] = max(f[j], f[j - v[i]] + w[i])。

代码实现

#include<bits/stdc++.h>using namespace std;const int MAXN = 1005;
int v[MAXN];    // 物品体积
int w[MAXN];    // 物品价值 
int f[MAXN];    // f[j]表示体积不超过j的情况下可以获得的最大价值int main() 
{int n, m;   cin >> n >> m;  // n表示物品个数,m表示背包容量// 输入每个物品的体积和价值for(int i = 1; i <= n; i++) cin >> v[i] >> w[i];// 01背包一维解法for(int i = 1; i <= n; i++) for(int j = m; j >= v[i]; j--)f[j] = max(f[j], f[j - v[i]] + w[i]);cout << f[m] << endl;   // 输出最大价值return 0;
}

总结

二维解法和一维解法都是经典的背包问题解法,二者的时间复杂度都是 O(nm)O(nm)O(nm),但是一维解法的空间复杂度为 O(m)O(m)O(m),比二维解法的 O(nm)O(nm)O(nm) 更优秀。因此,在实际应用中,一维解法更为常用


最后

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

1. 短期拼智力、中期拼毅力、长期拼体力。不要觉得自己落后了,用马拉松的心态,过自己的一生,你慢了一时一分,别焦虑。要看你我是否七八十岁,还有扛着锄头上山种橙子的那种勇气。

2.人间的美好,是3月的风,6月的雨,9月的云和12月的雪。

3.痛苦是对的。 痛苦源于对现状的不满,只有不满足于现状的人才会痛苦,痛苦才会深刻。痛苦的人,才有欲望去改造这一切。焦虑也是对的。焦虑是因为你想做得更好,说明你追求高,说明你眼界高,说明你知识多。痛苦和焦虑的人才是最真实的你我。

4.人生没有办法做到始终一帆风顺,也没有办法万事如意。但凡是你渴望的,都是你拿不到的;但凡是你乞求的,都是你实现不了的。 年轻人才会悔恨过去,能够坦然接受这一切的都是智者。

5.人生有一段路,一定要自己去走。 黎明前那一段天是最黑的, 但是只要再熬那么一会儿,天就亮了。 耐心就是智慧。 就连太阳光到达地球需要八分钟,你急什么呢? 那可是宇宙第一速度 。

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

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

相关文章:

【备战蓝桥杯】----01背包问题(动态规划)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

Golang1.18新特性介绍——泛型

社区长期高呼的泛型特性在Golang 1.18中终于正式发布&#xff0c;Go泛型实现与传统的C有较大差异&#xff0c;更像Rust的泛型实现。本文详细介绍Golang泛型及其特性&#xff0c;包括泛型语法、类型参数、类型约束、类型近似以及constraints包提供内置类型等。 最近写Dao代码&am…...

【SpringBoot17】SpringBoot中使用Quartz管理定时任务

定时任务在系统中用到的地方很多&#xff0c;例如每晚凌晨的数据备份&#xff0c;每小时获取第三方平台的 Token 信息等等&#xff0c;之前我们都是在项目中规定这个定时任务什么时候启动&#xff0c;到时间了便会自己启动&#xff0c;那么我们想要停止这个定时任务的时候&…...

杨辉三角形 (蓝桥杯) JAVA

目录题目描述&#xff1a;暴力破解&#xff08;四成&#xff09;&#xff1a;二分法破解&#xff08;满分&#xff09;&#xff1a;题目描述&#xff1a; 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如…...

AI制药 - AlphaFold Multimer 的 MSA Pairing 源码

目前最新版本是v2.3.1&#xff0c;2023.1.12 AlphaFold multimer v1 于 2021 年 7 月发布&#xff0c;同时发表了一篇描述其方法和结果的论文。AlphaFold multimer v1 使用了与 AlphaFold 单体相同的模型结构和训练方法&#xff0c;但增加了一些特征和损失函数来处理多条链。Al…...

TitanIDE:云原生开发到底强在哪里?

原文作者&#xff1a;行云创新技术总监 邓冰寒 引言 是一种新的软件开发方法&#xff0c;旨在构建更可靠、高效、弹性、安全和可扩展的应用程序。与传统的应用程序开发方式不同&#xff0c;云原生是将开发环境完全搬到云端&#xff0c;构建一站式的云原生开发环境。云原生的开…...

单片机常用完整性校验算法

一、前言 单片机在开发过程中经常会遇到大文件传输&#xff0c;或者大量数据传输&#xff0c;在一些工业环境下&#xff0c;数据传输并不是很稳定&#xff0c;如何检验数据的完整性就是个问题&#xff0c;这里简单介绍一下单片机常用的几种数据完整性校验方法。 二、CheckSum校…...

Anaconda 的安装配置及依赖项的内外网配置

在分享anaconda 的安装配置及使用前&#xff0c;我们必须先明白anaconda是什么&#xff1b;Anaconda是一个开源的Python发行版本。两者区别在于前者是一门编程语言&#xff0c;后者相当于编程语言中的工具包。 由于python自身缺少numpy、matplotlib、scipy、scikit-learn等一系…...

p84 CTF夺旗-PHP弱类型异或取反序列化RCE

数据来源 文章参考 本课重点&#xff1a; 案例1&#xff1a;PHP-相关总结知识点-后期复现案例2&#xff1a;PHP-弱类型对比绕过测试-常考点案例3&#xff1a;PHP-正则preg_match绕过-常考点案例4&#xff1a;PHP-命令执行RCE变异绕过-常考点案例5&#xff1a;PHP-反序列化考题…...

2022财报逆转,有赞穿透迷雾实现突破

2022年&#xff0c;商家经营面临困难。但在一些第三方服务商的帮助下&#xff0c;也有商家取得了逆势增长。 2023年3月23日&#xff0c;有赞发布2022年业绩报告&#xff0c;它帮助许多商家稳住了一整年的经营。2022年&#xff0c;有赞门店SaaS业务的GMV达到425亿元&#xff0c…...

蓝桥杯 - 求组合数【C(a,b)】+ 卡特兰数

文章目录&#x1f4ac;前言885. 求组合数 I C(m,n) 【dp】886 求组合数 II 【数据大小10万级别】 【费马小定理快速幂逆元】887. 求组合数 III 【le18级别】 【卢卡斯定理 逆元 快速幂 】888.求组合数 IV 【没有%p -- 高精度算出准确结果】 【分解质因数 高精度乘法 --只用一…...

膳食真菌在癌症免疫治疗中的作用: 从肠道微生物群的角度

谷禾健康 癌症是一种恶性肿瘤&#xff0c;它可以发生在人体的任何部位&#xff0c;包括肺、乳房、结肠、胃、肝、宫颈等。根据世界卫生组织的数据&#xff0c;全球每年有超过1800万人被诊断出患有癌症&#xff0c;其中约有1000万人死于癌症。癌症已成为全球范围内的主要健康问题…...

怎么将模糊的照片变清晰

怎么将模糊的照片变清晰?珍贵的照片每个人都会有&#xff0c;而遇到珍贵的照片变模糊了&#xff0c;相信会让人很苦恼的。那么有没有办法可以解决呢?答案是有的&#xff0c;我们可以用工具让模糊的照片变得清晰。下面就来分享一些让模糊的照片变清晰的方法&#xff0c;有兴趣…...

【软件测试】基础知识第一篇

文章目录一. 什么是软件测试二. 测试和调试的区别三. 什么是测试用例四. 软件的生命周期五. 软件测试的生命周期一. 什么是软件测试 软件测试就是验证软件产品特性是否满足用户的需求。 那需求又是什么呢&#xff1f;在多数软件公司&#xff0c;会有两种需求&#xff0c;一种…...

【百面成神】java web基础7问,你能坚持到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;纯手打总结面试题&#xff0c;自用备用 &#x1f330; 文章简介&#xff1a;java web最基础、重要的8道面试题 文章目…...

Centos7安装、各种环境配置和常见bug解决方案,保姆级教程(更新中)

文章目录前言一、Centos7安装二、各种环境配置与安装2.1 安装net-tools&#xff08;建议&#xff09;2.2 配置静态网络&#xff08;建议&#xff09;2.1 修改Centos7的时间&#xff08;建议&#xff09;2.2 Centos7系统编码问题2.3 vim安装&#xff08;建议&#xff09;2.4 解决…...

【C++进阶】智能指针

文章目录为什么需要智能指针&#xff1f;内存泄漏什么是内存泄漏&#xff0c;内存泄漏的危害内存泄漏分类&#xff08;了解&#xff09;如何避免内存泄漏智能指针的使用及原理smart_ptrauto_ptrunique_ptrshared_ptr线程安全的解决循环引用weak_ptr删除器为什么需要智能指针&am…...

软件测试面试题 —— 整理与解析(3)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;&#x1f30e;【Austin_zhai】&#x1f30f; &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xf…...

springboot常用的20个注解

Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架&#xff0c;它不仅可以方便地创建生产级的Spring应用程序&#xff0c;还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成&#xff0c; 而Spring Boot 之所以能够轻松地实现应的创建及与…...

USB组合设备——带鼠标功能的键盘

文章目录带鼠标功能的键盘一个接口实现报告描述符示例多个接口实现复合设备和组合设备配置描述符集合的实现报告的返回附 STM32 枚举日志复合设备&#xff1a;Compound Device 内嵌 Hub 和多个 Function&#xff0c;每个 Function 都相当于一个独立的 USB 外设&#xff0c;有自…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Qt Quick Controls模块功能及架构

Qt Quick Controls是Qt Quick的一个附加模块&#xff0c;提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中&#xff0c;这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构&#xff0c;与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...

Neo4j 完全指南:从入门到精通

第1章&#xff1a;Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...