【01背包】滚动数组优化实现一维01背包DP(对比朴素写法)
01背包
代码
背包问题的滚动数组优化版本建议在完全弄懂了普通的二维01背包问题后再进行食用,不然会出现消化不良的症状…
我们可以将背包问题中DP数组的下标看作成两个集合
下面对比两种不同实现方法的区别:
-
朴素二维DP版本
- 使用
dp[不超过i的物品集合][不超过j的背包集合]。 - 我们会发现,每次使用的
[不超过第i个物品的集合]只会是i和i-1,再往前的集合在后续的计算都不会被使用,所以可以采用滚动数组的思想,不断的更新一个一维数组来达到相同的目的。 - 同时,我们每次会对每一个物品寻找所有
[不超过j的背包的集合],如果背包放不下这个物品,直接继承没有放i物品的状态即可,也就是[不超过i-1位物品]的集合。 - 同时这里和优化版本的区别还在于
遍历顺序,朴素版本不用考虑遍历顺序,但是优化版本需要注意。
#include <iostream> using namespace std; // DP-normal-wayconst int N = 1010; int n, m; //n件物品 m容量的背包 int v[N], w[N]; //每件物品的体积 价值 int f[N][N]; //f[i][j]不超过第i件物品 背包容量不超过j /* 4 5 1 2 2 4 3 4 4 5 */int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> v[i] >> w[i]; //输入体积 价值 }//f[0][0~m]默认为零,无需进行初始化for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (j >= v[i]) f[i][j] = max(f[i-1][j], w[i] + f[i-1][j-v[i]]);else f[i][j] = f[i-1][j];}} cout << f[n][m] << endl; } - 使用
-
滚动数组优化版本 --> 一维DP(01背包问题终极写法)
dp[i][j]-->dp[j]删掉了i这个集合,相当于现在每次只存放了前一个物品的[背包不超过j]的最大值。- 比如第一次,
dp[]存放的是不超过第一个物品的[背包不超过j]的最大值。 - 第二次在第一次的基础上进行更新,这里需要注意背包集合的遍历顺序,需要思考如果还是正序遍历会带来什么影响?
- 没错,因为每次都要利用到之前的
[背包不超过j]的集合,如果正序遍历,那么就会从小的背包开始更新,那么就会把上一次的背包最大值覆盖掉,遍历到后面,j大起来了,要使用上一次也就是[物品不超过i-1]的[背包不超过j]的集合来进行更新就会碰到滚动数组数据被覆盖了的问题。 - 所以,需要注意的就是,要从大的背包开始遍历
j,这样就可以避免dp[背包容量<j]被覆盖掉,进行滚动的更新。
- 比如第一次,
#include <iostream> // 01背包1维写法 const int N = 10010; int n, m; //物品个数 背包容量 int v[N], w[N]; //每个物品的:体积 价值 int dp[N]; //优化前:不超过i的物品的体积和不超过j的背包 --> 优化后: 不超过i件物品 -->最大价值 /*输入数据不变: 4 5 1 2 2 4 3 4 4 5 */ using namespace std;int main() {cin >> n >> m;for (int i = 0; i < n; i++) {cin >> v[i] >> w[i];}for (int i = 1; i <= n; i++) {for (int j = m; j >= v[i]; j-- ) {dp[j] = max(dp[j], dp[j-v[i]] + w[i]);}}cout << dp[m] << endl; }
相关文章:
【01背包】滚动数组优化实现一维01背包DP(对比朴素写法)
01背包 代码 背包问题的滚动数组优化版本建议在完全弄懂了普通的二维01背包问题后再进行食用,不然会出现消化不良的症状… 我们可以将背包问题中DP数组的下标看作成两个集合 下面对比两种不同实现方法的区别: 朴素二维DP版本 使用dp[不超过i的物品集合]…...
深度学习500问——Chapter07:生成对抗网络(GAN)(2)
文章目录 7.2 GAN的生成能力评价 7.2.1 如何客观评价GAN的生成能力 7.2.2 Inception Score 7.2.3 Mode Score 7.2.5 Wasserstein distance 7.2.6 Frchet Inception Distance (FID) 7.2.7 1-Nearest Neighbor classifier 7.2.8 其他评价方法 7.3 其他常见的生成式模型有哪些 7.…...
A13 STM32_HAL库函数 之 HAL-ETH通用驱动 -- B -- 所有函数的介绍及使用
A13 STM32_HAL库函数 之 HAL-ETH通用驱动 -- B -- 所有函数的介绍及使用 1 通用定时器(TIM)预览1.11 HAL_ETH_TxCpltCallback1.12 HAL_ETH_RxCpltCallback1.13 HAL_ETH_ErrorCallback1.14 HAL_ETH_ReadPHYRegister1.15 HAL_ETH_WritePHYRegister1.16 HAL…...
Qotom Q720G5英特尔赛扬处理器N4000高性价比无风扇迷你电脑5网口软路由防火墙
在数字时代,迷你电脑已经成为高效、灵活的解决方案,无论是个人用户还是企业用户,都能从中受益。Qotom Q720G5 无风扇迷你电脑就是这样一款强大的选择,它不仅可以作为软路由、防火墙和路由器,还有着更多的潜力等待发掘。…...
如何了解数字化和信息化的区别?
在数字化浪潮席卷全球的今天,企业如何乘风破浪、实现转型升级? 数字化和信息化,这两个看似相似却各有千秋的概念,一直被人们拿来对比。 下面就来讲一讲我的理解: 从简单了说: “信息化”可以理解为传统数…...
CTF-SHOW SSRF
web351 存在一个flag.php页面,访问会返回不是本地用户的消息,那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议,之后判断我们传入的url中是否含有localhost和127.0.0,如果没有则…...
客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题
客户端传日期格式字段(string),服务端接口使用java.util.Date类型接收报错问题 问题演示第1种:客户端以URL拼接的方式传值第2种:客户端以body中的form-data方式提交第3种 客户端以Body中的json方式提交 问题解决(全局解…...
【Python面试题收录】什么是堆?什么是栈?栈和堆的区别是什么?
一、堆和栈的定义 (1)堆(Heap) 数据结构:堆是一种特殊的完全二叉树,满足父节点的值总是大于或等于(大根堆)其子节点的值。也可以是总是小于或等于(小根堆)其…...
5-云原生监控体系-Grafana-使用配置文件实现自动化导入Dashboard
文章目录 1. 介绍(此文档使用的版本 grafana-enterprise-10.0.3-1)2. 清空之前的实验数据3. 使用配置文件方式配置 Datasource3.1. 创建配置文件3.2. 重启服务并检查是否生效4. 使用配置文件方式配置 Dashboard4.1. 创建配置文件5. 配置 Dashboard JSON 文件5.1. 下载 JSON 文…...
Ollama、FastGPT大模型RAG结合使用案例
参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…...
夯实智慧新能源数据底座,TiDB Serverless 在 Sandisolar+ 的应用实践
本文介绍了 SandiSolar通过 TiDB Serverless 构建智慧新能源数据底座的思路与实践。作为一家致力于为全球提供清洁电力解决方案的新能源企业,SandiSolar面临着处理大量实时数据的挑战。为了应对这一问题,SandiSolar选择了 TiDB Serverless 作为他们的数据…...
MySQL数据库max_allowed_packet参数
如上图所示的报错,我在提交接口的时候出现了这个错误: MySqlConnector.MySqlException:Error submitting 4MB packet;ensure max_allowed_packet is greater than 4MB.在MySQL数据库中,有一个参数叫max_allowed_packet,这个参数会…...
Day98:云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露
目录 云原生-K8s安全-etcd(Master-数据库)未授权访问 etcdV2版本利用 etcdV3版本利用 云原生-K8s安全-Dashboard(Master-web面板)未授权访问 云原生-K8s安全-Configfile鉴权文件泄漏 云原生-K8s安全-Kubectl Proxy不安全配置 知识点: 1、云原生-K8s安全-etcd未…...
JUC下面常见的锁
这里写目录标题 1、ReentrantLock2、Semaphore3、CountDownLatch4、CyclicBarrier 1、ReentrantLock ReentrantLock 是属于独占模式, 即同一时刻只允许一个线程获取锁。 2、Semaphore Semaphore 属于共享模式,synchronized 和 ReentrantLock 都是一次只…...
Uniapp+基于百度智能云完成AI视觉功能(附前端思路)
本博客使用uniapp百度智能云图像大模型中的AI视觉API(本文以物体检测为例)完成了一个简单的图像识别页面,调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…...
Android 软件盘的弹出和消失的监听
监听接口 OnKeyboardListener.java public interface OnKeyboardListener {void onKeyboardHidden();void onKeyboardShow(int keyboardHeight);} KeyBoardUtil.java public class KeyBoardUtil {private final static String TAG "KeyBoardUtil";public PopupWi…...
通俗易懂HTTP和HTTPS区别
HTTP:超文本传输协议,它是使用一种明文的方式发送我们的内容,没有任何的加密,例如我们要在网页上输入账号密码,如果使用HTTP协议,账号密码就可能会被暴露,默认端口是80. HTTPS:是HT…...
【ZZULIOJ】1061: 顺序输出各位数字(Java)
目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 输入一个不大于10的9次方的正整数,从高位开始逐位分割并输出各位数字。 输入 输入一个正整数n,n是int型数据 输出 依次输出各位上的数字,每一个数字后面有一个空格…...
java数据结构与算法刷题-----LeetCode260. 只出现一次的数字 III
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 与运算取末尾1分组 与运算取末尾1分组 解题思路:时间…...
AWS被误扣费了,怎么解决?
有时在使用aws时,可能会无意中被AWS扣费,对于如何处理这个问题,作为aws的合作伙伴,接下来由九河云进行讲解: (1)审查账单:首先,您需要仔细审查AWS账单,了解具…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
