【第二十五课】动态规划:01背包问题(acwing-2 / 思路 / c++代码 (二维数组))

目录

前言

acwing-2 01背包问题

思路 

思路误区(可跳)

代码 


嗯,,在网上搜了一下蓝桥杯动态规划好像出题比较多,也没有任何其他建议,现在进度可能比较慢,所以就想着先学动态规划再看数论吧,不知道对不对🥀

前言

反正受到外界干扰够多了,看着"动态规划""背包"这些标题都觉得发怵。。。好好学吧

动态规划(Dynamic Programming, DP)是一种解决优化问题的算法思想,常用于求解最优化问题,我们这里主要学习的就是解决背包问题。(关于为什么叫动态规划,就只是个命名而已不用纠结)

背包问题就是给定一个容量为V,给出N件物品,每件物品有其体积和价值,让我们得出一种解决方案使得在满足背包容量V的前提下,这些选出的物品的总价值能达到最大。

背包问题又按可选择的物品的次数分为01背包(即每件物品最多只能被选择一次)、完全背包(即每件物品可以被选择无限次)、多重背包(即每种物品有限制的放入次数)、分组背包(即物品被分为若干组,每组中的物品最多只能选择一个放入背包)

acwing-2 01背包问题

思路 

(静下心认真看题目) 

我的思考历程:

刚看到这道题的时候,我的第一印象是觉得变量好多,需要在纸上列一下,理清思路。认真读完题之后,我觉得这道题要求的就是我们在满足容量限制的条件下,选择一些(没有限制选多少件物品)物品使得我们所得到的价值最大。

那么顺着思路下去,也就是我们要列举所有的情况,以得到最大价值。

那么如何列举所有情况呢?好像是意识到要利用二维数组,不过行列分别表示什么含义没想出来。(考虑不够深入吧)

看完讲解之后:

我们的思路是没问题的,确实要利用二维数组来列举所有的情况,dp[i][j]数组,下标 :i表示只考虑前i件物品,j表示最大容量不超过j,dp数组的元素的含义是:在 i j 两个因素的限制下,所得到的最大价值。(注意区分数组元素的含义和数组下标含义的不同)

这里我们运用动态规划的算法思想,将问题分解为更小的子问题,这道题里子问题也就是考虑更少的物品和更小的背包容量。当我们说“从前i个物品中选”,我们实际上是在说:“如果我们只考虑前i个物品,那么我们可以得到什么结果?”

为什么这里子问题是这样的呢?(我之前误解 i 的含义是从这些可选择的物品中选 i 件物品,)


在背包问题中,我们的目标是在给定背包容量的限制下,选择一些物品以使得总价值最大。这个问题可能看起来很复杂,因为有很多物品可以选择,而且每个物品都有自己的重量和价值。会有非常多情况。但是当我们举一些简单的例子,观察一下。

如果只有一个物品可以选择,那么我们应该如何选择?这个问题的答案很简单:如果这个物品的重量小于或等于背包的容量,那么我们就选择这个物品;否则,我们就不选择任何物品。

然后,我们可以考虑一个稍微复杂一点的问题:如果有两个物品可以选择,那么我们应该如何选择?这个问题的答案也相对简单:我们可以分别考虑选择和不选择每个物品的情况,然后选择总价值最大的那一种。这里的思路是:每件物品我们都可以选择拿或者不拿。在有两个物品可以选择的情况下:

图中已经将我们只有一件物品可选时所得出的结果对于:当有两件物品可选时所发挥的作用用不同颜色标注出来。我们可以清晰的看到子问题对于当前问题的作用

也就是说我们将状态计算(价值计算)分成两种情况:不包含第i个物品 dp[i-1][j] 和 包含第i个物品 dp[ i-1][ j-vi ]+wi

(这两个j表示的都是“只能在前i个物品中选,且容量不大于j” 的情况下的 j )

-

是因为我们把这个大的问题看成了,每次在之前的基础上多加一件可选择的物品,针对这个添加的物品,对原本已经有的结果进行选择添加这件新物品与否的情况判断,最终得到最大值

到这里应该对动态规划解决背包问题的思路可以清楚了。(呼气)

下面是y总总结的图,上面思路明白的话,这里的一些名词应该也很容易能理解啦。

思路误区(可跳)

在学习动态规划的思路之前,我想过这种思路:

i 的含义是从这些可选择的物品中选 i 件物品,每一个i都计算出符合条件的最大价值,这样在下一次i的数量每次加一的时候,我们只需要在没有选择过的物品中进行挑选符合容量限制且使得价值最大的物品,以此来求得最终问题的答案。

好吧,我继续问:如果仅仅是看这种思路,而不考虑已有的动态规划思想的知识储备的情况下,这种思路是否可行呢? 

取自bing:

这种思路在某些特定情况下可能是可行的,但并不适用于所有情况

这种思路的一个主要问题是,它假设每次选择物品都是独立的,即选择某个物品不会影响到其他物品的选择。然而,在许多实际问题中,物品之间往往是有关联的。例如,选择了某个物品可能会限制我们选择其他物品的能力。在这种情况下,我们不能简单地从剩余的物品中挑选一个符合容量限制且使得价值最大的物品。(关于这种情况我又继续问了举出一个例子:如下图)

这种方法可能并不总是能得到最优解,原因在于它没有充分利用动态规划的优势——记忆化搜索和避免重复计算。在动态规划中,我们会记录下在每个状态(即考虑了前i个物品,背包容量为j时的最大价值)下的最优解,然后在这个基础上考虑下一个物品。这样可以避免在考虑每个物品时都要从头开始计算,大大提高了效率。

好啦,思路就说到这里啦。

 

代码 

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;//n表示物品数量 m表示背包容量
int v[N],w[N];//v数组存储每件物品的体积,w数组存储每件物品的权值
int dp[N][N];//dp[i][j]二维数组的每个元素表示的是:只从前i个物品中选择,且容量要小于j的情况下的最大价值
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>v[i]>>w[i];//读取每件物品
    //当i为0,也就是有0个可选物品,那么其对应的所有j容量值的情况下价值都为0,刚好初始化的时候就是全部初始化为0,因此我们i从1开始
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            //我们双层循环就是为了进行状态计算,给dp数组赋值
            //不包含第i个物品
            dp[i][j]=dp[i-1][j];
            //包含第i个物品 只有当第i个物品的体积小于当前最大容量的时候我们才考虑这种情况,否则没有意义
            if(j>=v[i])dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<dp[n][m];
    return 0;
}

一些必要的解释就放在注释里啦。 

只要我们清楚dp数组及其下标的含义,对应到代码中每一步的作用也就很清晰了。


先写到这里啦。这两天会补一下优化成一维数组的写法。(宿舍要关门了😂)

动态规划的学习开始的很艰难,不过相信会越来越清晰的!

如果有问题欢迎指出,非常感谢!!一起加油!!!

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

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

相关文章

【STM32备忘录】【STM32WB系列的BLE低功耗蓝牙】一、测试广播配置搜不到信号的注意事项

文章目录 一、预备知识&#xff1a;二、准备工具&#xff1a;三、FUS和无线协议栈更新流程四、广播例程测试五、DEBUG输出调试 一、预备知识&#xff1a; WB系列是双核单片机&#xff0c;用户写M4&#xff0c;无线协议栈使用M0新买到手的单片机&#xff0c;需要自己刷入使用的…

栈的概念及应用

目录 一. 概念 二. 栈的使用 三. 栈的模拟实现 四. 栈的应用 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 链接 4. 逆波兰表达式求值 链接 5. 出栈入栈次序匹配 链接 6. 最小栈 链接 一. 概念 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的…

书生·浦语大模型图文对话Demo搭建

前言 本节我们先来搭建几个Demo来感受一下书生浦语大模型 InternLM-Chat-7B 智能对话 Demo 我们将使用 InternStudio 中的 A100(1/4) 机器和 InternLM-Chat-7B 模型部署一个智能对话 Demo 环境准备 在 InternStudio 平台中选择 A100(1/4) 的配置&#xff0c;如下图所示镜像…

使用Docker部署Nacos集群和Nginx高可用负载(9节点集群部署)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容部署Nacos集群Nginx高可用负载 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专…

C#,动态规划(DP)N皇后问题(N Queen Problem)的回溯(Backtracking)算法与源代码

1 N皇后问题&#xff08;N Queen Problem&#xff09; 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。 2 回溯算法 回溯算法实际上一个类似枚…

我把steam游戏搬砖当副业,一个月赚7K+想给有梦想的人提个醒

假如你不工作了&#xff0c;还有收入吗&#xff1f;去掉日常的开销&#xff0c;还剩多少呢&#xff1f;可以靠steam游戏搬砖项目翻身吗&#xff1f;总以为&#xff0c;只要卖力工作&#xff0c;努力赚钱&#xff0c;就能实现财富自由。殊不知&#xff0c; 你的死工资&#xff0…

如何在Linux Ubuntu系统使用Docker快速部署MongoDB并公网访问

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署Mon…

TypeScript 用起来真是太痛苦了

此前我写了几篇文章&#xff0c;关于 Electron&#xff0c;关于 Vue&#xff0c;创建项目的时候&#xff0c;我都默认选择了使用 TypeScript 的模板&#xff0c;不过我都加了一句话&#xff0c;初学者如果不想自己找麻烦的话&#xff0c;最好不要使用 TypeScript。原因呢&#…

QT-Day5

思维导图 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);if(!db.contains("stuInfo.db")){//说明数据库不存在db QSqlDatabase::addDatabase("…

TikTok矩阵系统的功能展示:深入解析与源代码分享!

今天我来和大家说说TikTok矩阵系统&#xff0c;在当今数字化时代&#xff0c;社交媒体平台已成为人们获取信息、交流思想和娱乐放松的重要渠道&#xff0c;其中&#xff0c;TikTok作为一款全球知名的短视频社交平台&#xff0c;凭借其独特的创意内容和强大的算法推荐系统&#…

20. 【Linux教程】emacs 编辑器

前面小节介绍了如何使用 vim 编辑器和 nano 编辑器&#xff0c;本小节介绍 emacs 编辑器&#xff0c;emacs 编辑器最开始是作为控制台的编辑器&#xff0c;并且 emacs 编辑器仍然提供最早的命令行模式。 1. 检查 Linux 系统中是否安装 emacs 编辑器 使用如何命令检查 emacs 编…

小主机折腾记22

最近总是心不在焉&#xff0c;于是决定把家里的海景房机箱升级下&#xff0c;顺便把之前剩的x99散热器&#xff0c;蓝宝石RX590&#xff0c;内存硬盘等利用上 咸鱼买了一个长城G6 淘宝买了一张X99D4M4&#xff08;4相8倍供电那款&#xff09; 今天主板到了&#xff0c;开整 先测…

DO-248C:Do-178C和Do-278A的支持信息-常见问题解答 (FAQ) (2)

3.0 常见问题解答 (FAQ) FREQUENTLY ASKED QUESTIONS (FAQ) 本节汇总了 DO-178C 和 DO-278A 常见问题解答。 常见问题解答的目的是对业界经常提出的有关 DO-178C 和/或 DO-278A 材料的问题提供简短而简洁的答复。 这些问题经常向认证机构或提供 DO-178C 和/或 DO-278A 解释的其…

韩国突发:将批准比特币ETF

作者&#xff1a;秦晋 韩国两党宣布将批准比特币ETF。比特币也再次成为竞选的宠儿。 4月10日&#xff0c;韩国将迎来每隔4年而进行的一次立法大选。在大选之前&#xff0c;现执政党与反对党都承诺将批准比特币ETF。 我们知道&#xff0c;比特币的主要受众群体以年轻人居多。此前…

四、分类算法 - 决策树

目录 1、认识决策树 2、决策树分类原理详解 3、信息论基础 3.1 信息 3.2 信息的衡量 - 信息量 - 信息熵 3.3 决策树划分的依据 - 信息增益 3.4 案例 4、决策树API 5、案例&#xff1a;用决策树对鸢尾花进行分类 6、决策树可视化 7、总结 8、案例&#xff1a;泰坦尼…

景联文科技:引领战场数据标注服务,赋能态势感知升级

自21世纪初&#xff0c;信息化战争使战场环境变得更为复杂和难以预测&#xff0c;持续涌入的海量、多样化、多来源和高维度数据&#xff0c;加大了指挥员的认知负担&#xff0c;使其需要具备更强的数据处理能力。 同时&#xff0c;计算机技术和人工智能技术的飞速发展&#xff…

模板的初阶

目录 【本节目标】 1.泛型编程 2.函数模板 2.1函数模板概念 2.1 函数模板格式 2.3函数模板的原理 2.4函数模板的实例化 2.5模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 【本节目标】 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 如何实现…

jeesite用字典项配置二级下拉选

1、配置字典项 2、html代码&#xff1a;修改下拉选项框 <div class"col-xs-6"><div class"form-group"><label class"control-label col-sm-4" title""><span class"required">*</span> ${…

电脑桌面备忘录怎么设置?如何在电脑桌面上添加便签?

在日常生活中&#xff0c;电脑桌面上的便签功能可以帮助我们更有效地管理待办事项和重要信息。下面就让我们一起来学习电脑桌面备忘录怎么设置&#xff0c;如何在电脑桌面上添加便签吧。 首先&#xff0c;我们需要找到操作系统中的“小部件”或“小工具”选项。通常情况下&…

[C++][linux]Linux上内存共享内存用法

一&#xff0c;什么是共享内存 共享内存&#xff08;Shared Memory&#xff09;&#xff0c;指两个或多个进程共享一个给定的存储区。进程可以将同一段共享内存连接到它们自己的地址空间中&#xff0c;所有进程都可以访问共享内存中的地址&#xff0c;就好像它们是由用C语言函…