蓝桥杯备赛 week 4 —— DP 背包问题

4f98a9c59ce74fdf8a8e091ccd5d1637.png

目录

🌈前言🌈:

📁 01背包问题

分析:

dp数组求解:

优化:滚动数组:

📁 完全背包问题

📁 总结 


 

🌈前言🌈:

5f118b7370de4d3b8b0e828d3bc887e0.gif

 

        这篇文章主要是准备蓝桥杯竞赛同学所写,为你更好准备蓝桥杯比赛涉及的算法知识点。不知道你是否苦恼于不知算法从何学起,苦恼于网上资料稀少,或者复杂难懂,这篇文章就是帮助这部分同学的。

        本篇文章适合基础较弱或零基础的同学,不会涉及晦涩难懂的公式,只是提供算法的思路,题解会从基础讲解,不会涉及大量复杂的证明,重要的是学废思想。

        背包问题分为很多种,因为是基础学习,所以只是讲解最为简单的两种背包问题,其他的背包问题基本都是变形,例如多重背包问题。

        01背包问题是有N种物品,每种物品就1件,让我们求在不超过背包容量M的前提下,拿到的物品总价值是多少。

        完全背包问题是有N种物品,每种物品无限件,求在不超过背包容量M的前提下,最大物品价值是多少。

📁 01背包问题

2. 01背包问题 - AcWing题库

0f297414ac1c4645b78886c2c67bef95.png

881c5d73dc1b4c4b8ff2eb585442f3fb.png

分析:

        首先,我们拿到一道题目,首先要读懂题目。题目说,有N种物品,每种物品是1件。我们首先想到的肯定是暴力解法,通过不断的枚举来求出最大价值,例如第一件物品选不选,第二件物品选不选的思路来做。

        这么想是没有问题的,这就是回溯算法,但是有个弊端是时间复杂度很高,达到2^N,所以我们就得换个思路了。

dp数组求解:

        这里介绍一个B站up主大雪莱的一种方法,可以解决很多dp问题,即闫氏dp分析法。

        i 表示前 i 件物品 ; j 表示 当前体积  ;dp[ i ][ j ] 任取前 i 个物品在总体积不超过 j 的所有选法的最大值。( 重点理解!!!)

        我们通过枚举 j 从 0 到 M 求出,在当前 j 体积的情况下,选取前 i 件物品价值的最大值。

84423359f29b4237b92bf75780981667.png

        所以背包问题就是递推的问题,由小到大求出最大价值。而题目就是让我们求前n个物品总体重不超过m的情况,所以我们最后输出dp[n][m]即可。

        举个例子,如下图所示。当前 i = 1 时,从第一件物品选择,总体积不超过 0,1,2 的情况下的最大值。

c7fe886e8c85499ca549162f6dab2979.png

        如果,你理清了上面这两幅图片,你也就搞懂了01背包问题了。下面,我们来看一下代码。

#include<iostream>
#include <algorithm>using namespace std;const int N =1010;int n,m;          n表示物品数量,m表示背包容量
int w[N],v[N];    w表示体重,v表示价值
int dp[N][N];int main()
{cin>>n>>m;for(int i=1;i<=n;i++)cin>>w[i]>>v[i];for(int i=1;i<=n;i++)for(int j=0;j<=m;j++){if(j >= w[i])dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);elsedp[i][j] = dp[i-1][j];}cout<<dp[n][m]<<endl;return 0;
}

优化:滚动数组:

        以上就是通过二维数组来实现01背包问题,在做题过程中,我们发现第 i 层的最大值,是通过第 i - 1层推导出来的。

        这里,我们就可以进行优化,将二维数组变为一维数组。因为 i 的作用就是标明前i个物品,而我们只是用了 i-1层 和 i层,这两层,因此就可以将上一层拷贝到下一层。

        如下图所示,我们可以定义一个一维数组,从后往前枚举。因为是一维数组,并且我们要进行递推,所以前面会影响后面,如果我们从往后枚举,就不是上一层的最大值了(重点理解!!

868323eeb84546a1bdf641a3e183a176.png

#include<iostream>
#include <algorithm>using namespace std;const int N =1010;int n,m;
int w[N],v[N];
int dp[N];int main()
{cin>>n>>m;for(int i=1;i<=n;i++)cin>>w[i]>>v[i];for(int i=1;i<=n;i++)for(int j=m;j>=w[i];j--){dp[j] = max(dp[j],dp[j-w[i]] + v[i]);}cout<<dp[m]<<endl;return 0;
}

        01背包问题,如果是初次接触,可能稍微有点繁琐,绕。所以需要自己多多画图,不断调试代码,画出每一层的每个选法的最大值方便更好的理解。

📁 完全背包问题

3. 完全背包问题 - AcWing题库

9f228b6f7abe49f1853e7124c19edf32.png

6019e9b7f7ca48198b93de5643c81c8b.png

        本文寻寻渐进的,如果你还没有搞懂01背包问题可能还需要多花时间理解,对于完全背包问题,也只是对01背包优化后一维数组的变形。

        01背包的一维数组优化是从后往前遍历的,而完全背包问题则是从前往后遍历的。就这一点不同。

        如果从前往后遍历,就意味着第i个物品可以选多个,所以就可以比较上一层的dp[ j ] 和 再选依次第i个物品的总价值。因为完全背包问题每种物品可以选择多次。

#include <iostream>
#include <algorithm>
using namespace std;const int N = 1010;
int n,m;
int v[N],w[N];
int dp[N];int main()
{cin>>n>>m;for(int i=1;i<=n;i++)cin>>w[i]>>v[i];for(int i=1;i<=n;i++)for(int j=w[i];j<=m;j++)dp[j] =max(dp[j],dp[j-w[i]]+v[i]);cout<<dp[m]<<endl;return 0;
}

 

📁 总结 

        以上,就是dp问题中基础的背包问题,以01背包为例子,如何分析dp背包问题,以及讲解01背包问题的优化,从而讲解了完全背包问题。

        如果感觉对你有帮助,欢迎点赞,收藏,关注。Thanks♪(・ω・)ノ

038dd37350b949ea981697a9513ecfba.gif

 

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

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

相关文章

水文模型SWMM与LisFlood耦合(pdf文档、软件见资源)

总技术路线图 INP生成图解 文献&#xff1a;面向服务的Web-SWMM构建研究 regardingINP为ArcGIS Pro项目 1.SWMM模型数据准备与参数设置 1.子汇水区 文件位于&#xff1a;beforeGenerateINP/generateSub.py&#xff08;一级划分&#xff09; 问题&#xff1a; 水文分析阈值划…

文献翻译 || Ubuntu安装zotero文献管理软件,提高文献阅读效率

文章目录 前言安装方式选择apt方式snap方式 zotero的简单使用文献导入中文翻译插件下载并安装使用体验 前言 虽然在win下有很多文献管理软件和好用的文献翻译软件&#xff0c;但是如果平常有使用Ubuntu进行开发的需求&#xff0c;实际上很不愿意为了好好看文献专门切到Windows…

万界星空科技可视化数据大屏的作用

随着科技的不断发展和进步&#xff0c;当前各种数据化的设备也是如同雨后春笋般冒了出来&#xff0c;并且其可以说是给我们带来了极大的便利的。在这其中&#xff0c;数据大屏就是非常具有代表性的一个例子。 数据大屏的主要作用包括&#xff1a; 数据分析&#xff1a;数据大屏…

react中优化类名写法(类似与vue的动态class对象方式)

安装和引入方式 npm install classnamesimport classNames form classsnames//render 方法中&#xff0c;需要动态className的地方直接参照上图使用

ElasticSearch的集群管理命令

ElasticSearch版本 {"name" : "data-slave1","cluster_name" : "data-es","cluster_uuid" : "xxxxxxxxxx-eMwxw","version" : {"number" : "7.2.1","build_flavor" : &…

解决python环境下Failed to load OpenH264 library: openh264-1.8.0-win64.dll

错误信息&#xff1a; OpenCV: FFMPEG: tag 0x34363248/H264 is not supported with codec id 27 and format mp4 / MP4 (MPEG-4 Part 14) OpenCV: FFMPEG: fallback to use tag 0x31637661/avc1 Failed to load OpenH264 library: openh264-1.8.0-win64.dll Please check …

案例分享 | 助力数字化转型:嘉为科技项目管理平台上线

嘉为科技项目管理平台&#xff08;一期&#xff09;基于易趋&#xff08;EasyTrack&#xff09;进行实施&#xff0c;通过近一年的开发及试运行&#xff0c;现已成功交付上线、推广使用&#xff0c;取得了良好的应用效果。 1.关于广州嘉为科技有限公司&#xff08;以下简称嘉为…

2024年,我与CSDN的邂逅之旅:一段燃烧激情、成就梦想的博客专家之路

文章目录 初入CSDN知识分享的本质什么有用学什么 成为博客专家的经历成为博客专家有什么好处实际好处隐形好处 今天获得了CSDN认证的博客专家&#xff0c;感觉很开心~分享一下这个始末。分享一下我和CSDN的5年邂逅。 初入CSDN 进入CSDN已经五年了&#xff0c;大一开始写博客&a…

zabbix使用自动发现批量监控服务器

当有大量新增服务器需要监控时&#xff0c;为避免一台一台手动操作浪费人力&#xff0c;我们使用自动发现功能来进行操作&#xff1a; 以下以zabbix6.4.0版本为例 如下,点击自动发现&#xff0c;创建发现规则&#xff1a; 点击更新&#xff0c;保存&#xff0c;之后点告警---…

阿里云负载均衡对接

1 、开通负载均衡产品 2 、ALB / NLB / CLB ALB&#xff1a; 应用型负载均衡 &#xff0c; 给定对应服务域名与当前实例DNS绑定之后即可使用 支持&#xff1a; HTTP/HTTPS/QUIC等应用层流量协议 NLB&#xff1a; 网络型负载均衡 支持&#xff1a; TCP / UDP / TCPSSL C…

leetcode88合并两个有序数组

力扣&#xff08;LeetCode&#xff09;-合并两个有序数组 方法一 | 合并后排序 题目要求将两个有序数组合并并保证合并后的数组仍然有序。 观察题目可以看出&#xff0c;nums1的容量大小总是 mn&#xff0c;所以 nums2能够合并到 nums1中。 那就将 nums1中未赋值的地方赋上 …

C2000ware介绍

C2000ware介绍 C2000的下载安装指南 C2000目录 boards 主要存放的时候TI官方自己做的一些板子,做硬件可以参考这里的最小系统的外围。 跟硬件相关 device_support 罗列C2000系列所支持的器件