C++知识点总结(59):背包型动态规划
背包型动态规划
- 一、背包 dp
- 1. 01 背包(限量)
- 2. 完全背包(不限量)
- 3. 口诀
- 二、例题
- 1. 和是质数的子集数
- 2. 黄金的太阳
- 3. 负数子集和
- 4. NASA的⻝物计划
一、背包 dp
1. 01 背包(限量)
假如有这几个物品(前面的数是价值,后面的数是体积):(5,2)(18,7)(14,6)
则推导的 dp[][] 表格应该如下(行表示宝石个数,列表示背包容量变化):
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| 2 | 0 | 0 | 5 | 5 | 5 | 5 | 5 | 18 | 5 |
| 3 | 0 | 0 | 5 | 5 | 5 | 5 | 14 | 18 | 19 |
总的来说,可以用下面流程图简单概括:
容量<宝石体积(装不进):dp[i][j]=dp[i-1][j]
容量>=宝石体积(装或不装):dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+v[i]}
模板:
#include<bits/stdc++.h>
using namespace std;
int n,m,w[10005],v[10005],dp[10005];
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],v[i]+dp[j-w[i]]);cout<<dp[m];return 0;
}
2. 完全背包(不限量)
假如有这几个物品(前面的数是价值,后面的数是体积):(2,3)(3,4)(4,5)
则推导的 dp[][] 表格应该如下(行表示宝石个数,列表示背包容量变化):
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 3 | 3 | 3 | 6 | 6 | 6 |
| … |
模板:
#include<bits/stdc++.h>
using namespace std;
int n,m,v[10005],e[10005],dp[10005];
int main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>v[i]>>e[i];for(int i=1;i<=n;i++)for(int j=v[i];j<=m;j++)dp[j]=max(dp[j],e[i]+dp[j-v[i]]);cout<<dp[m];return 0;
}
3. 口诀
遇到 dp 怎么办?凉拌炒鸡蛋,洛谷上面加颗蛋。翻个面,金灿灿,01 完全背模板。
二、例题
1. 和是质数的子集数
给出 n n n 个正整数,问存在多少个子集,使得子集中所有数的和是质数。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e2+8;
const int MAXS=1e5+8;
const int MOD=1e9+7;
int n,s,a[MAXN],dp[MAXS];
bool isPrime(int n){if(n<2)return 0;for(int i=2;i*i<=n;i++)if(n%i==0)return 0;return 1;
}
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i],s+=a[i];dp[0]=1;for(int i=1;i<=n;i++)for(int j=s;j>=a[i];j--)dp[j]=(dp[j]+dp[j-a[i]])%MOD;int ans=0;for(int i=2;i<=s;i++)if(isPrime(i))ans=(ans+dp[i])%MOD;cout<<ans;return 0;
}
2. 黄金的太阳
黄金的太阳独创了一种精灵召唤技能。玩家在冒险中收集精灵,然后就可以在战斗中利用精灵的能量,使用各种召唤技能。
每种召唤技能需要消耗精灵的能量,玩家的精灵能提供的总能量等于 m m m 点。当释放召唤技能时,根据技能的消耗,需要同等数量的能量,消耗掉的能量不会再恢复。只要有足够的能量,每种技能都可以无限次使用。
玩家目前收集的精灵能够提供的能量等于 m m m 点。有 n n n 种不同的召唤技能可以使用,第 i i i 种技能的消耗为 c i c_i ci 点能量,伤害为 d i d_i di。
敌人的体力为 H H H,当总伤害大于等于 H H H 时,敌人就被击败了。问击败敌人时,还剩下的(可以提供能量的)精灵的最多数量。如果无法击败敌人,输出 −1。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e2+8;
const int MAXH=1e5+8;
const int INF=0x3f3f3f3f;
int n,m,h,c[MAXN],d[MAXN],dp[MAXH];
int main(){cin>>n>>m>>h;for(int i=1;i<=n;i++)cin>>c[i]>>d[i];memset(dp,INF,sizeof(dp));dp[0]=0;for(int i=1;i<=n;i++)for(int j=0;j<=h;j++)dp[j]=min(dp[j],dp[max(0,j-d[i])]+c[i]);cout<<max(-1,m-dp[h]);return 0;
}
3. 负数子集和
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e1+8;
const int MAXS=1e4+8;
const int MOD=998244353;
int n,s;
map<int,int>dp;//和为j的子集总数
int main(){cin>>n>>s;dp[0]=1;for(int i=1,a;i<=n;i++){cin>>a;if(a>=0)for(int j=MAXS;j>=-MAXS;j--)dp[j]=(dp[j-a]+dp[j])%MOD;elsefor(int j=-MAXS;j<=MAXS;j++)dp[j]=(dp[j-a]+dp[j])%MOD;}cout<<dp[s]%MOD;return 0;
}
4. NASA的⻝物计划
NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力下终止了航天飞机的历史,但是此类事情会不会在以后发生,谁也无法保证,在遇到这类航天问题时,解决方法也许只能让航天员出仓维修,但是多次的维修会消耗航天员大量的能量,因此NASA便想设计一种食品方案,让体积和承重有限的条件下多装载一些高卡路里的食物.
航天飞机的体积有限,当然如果载过重的物品,燃料会浪费很多钱,每件食品都有各自的体积、质量以及所含卡路里,在告诉你体积和质量的最大值的情况下,请输出能达到的食品方案所含卡路里的最大值,当然每个食品只能使用一次.
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e2+8;
const int MAXV=4e2+8;
const int MAXW=4e2+8;
int n,vol,wt,v[MAXN],w[MAXN],c[MAXN],dp[MAXV][MAXW];
int main(){cin>>vol>>wt>>n;for(int i=1;i<=n;i++)cin>>v[i]>>w[i]>>c[i];for(int i=1;i<=n;i++)for(int j=vol;j>=v[i];j--)//体积for(int k=wt;k>=w[i];k--)//重量dp[j][k]=max(dp[j][k],dp[j-v[i]][k-w[i]]+c[i]);cout<<dp[vol][wt];return 0;
}
相关文章:
C++知识点总结(59):背包型动态规划
背包型动态规划 一、背包 dp1. 01 背包(限量)2. 完全背包(不限量)3. 口诀 二、例题1. 和是质数的子集数2. 黄金的太阳3. 负数子集和4. NASA的⻝物计划 一、背包 dp 1. 01 背包(限量) 假如有这几个物品&am…...
C++:反向迭代器的实现
反向迭代器的实现与 stack 、queue 相似,是通过适配器模式实现的。通过传入不同类型的迭代器来实现其反向迭代器。 正向迭代器中,begin() 指向第一个位置,end() 指向最后一个位置的下一个位置。 代码实现: template<class I…...
webGL入门教程_04vec3、vec4 和齐次坐标总结
vec3、vec4 和齐次坐标总结 1. vec3 和 vec4 1.1 什么是 vec3 和 vec4? vec3: GLSL 中的三维向量类型,包含 3 个浮点数:(x, y, z)。常用于表示三维坐标、RGB 颜色、法线、方向等。 vec4: GLSL 中的四维向量类型&…...
uniapp中父组件数组更新后与页面渲染数组不一致实战记录
简单描述一下业务场景方便理解: 商品设置功能,支持添加多组商品(点击添加按钮进行增加).可以对任意商品进行删除(点击减少按钮对选中的商品设置进行删除). 问题: 正常添加操作后,对已添加的任意商品删除后,控制台打印数组正常.但是与页面显示不一致.已上图为例,选中尾…...
优化 Conda 下载速度:详细的代理配置和网络管理策略
优化 Conda 下载速度:详细的代理配置和网络管理策略 为了彻底解决使用 Conda 下载 PyTorch 时遇到的速度问题,并确保下载过程稳定可靠,这需要一个详细、综合的技术方案。让我们更深入地分析问题原因,然后详尽地解释采取的解决策略…...
服务器遭受DDoS攻击后如何恢复运行?
当服务器遭受 DDoS(分布式拒绝服务)攻击 后,恢复运行需要快速采取应急措施来缓解攻击影响,并在恢复后加强防护以减少未来攻击的风险。以下是详细的分步指南: 一、应急处理步骤 1. 确认服务器是否正在遭受 DDoS 攻击 …...
MFC音视频播放器-支持电子放大等功能
前言 本播放器在VS2019下开发,使用ffmpegD3D实现视频播放渲染功能。同时本播放器支持录像功能、截图功能、音视频播放功能、码流信息显示、电子放大功能等。D3D的渲染同时支持surface和texture两种方式,电子放大功能是在D3D Texture方式下进行实现。以下…...
c语言编程1.17蓝桥杯历届试题-回文数字
题目描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之…...
el-table 纵向 横向 多级表头
<el-table :data"tableData" class"diaTable":span-method"handleSpanMethod"border:header-cell-style"{background:#292929,color:#fff}"><!-- 纵向表头 --><el-table-column label"纵向表头" width"…...
uniapp开发微信小程序笔记8-uniapp使用vant框架
前言:其实用uni-app开发微信小程序的首选不应该是vant,因为vant没有专门给uni-app设置专栏,可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 但是vant的优…...
分布式项目使用Redis实现数据库对象自增主键ID
hello。大家好,我是灰小猿,一个超会写bug的程序猿! 在分布式项目中,数据表的主键ID一般可能存在于UUID或自增ID这两种形式,UUID好理解而且实现起来也最容易,但是缺点就是数据表中的主键ID是32位的字符串&a…...
npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\
1.问题 没有找到对应的某种依赖,node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...
SolarCube: 高分辨率太阳辐照预测基准数据集
太阳能作为清洁能源在减缓气候变化中的作用日益凸显,其稳定的供应对电网管理至关重要。然而,太阳辐照受云层和天气变化的影响波动较大,给光伏电力的管理带来挑战,尤其是在调度、储能和备用系统管理方面。因此,精确的太…...
华为小米苹果三星移动设备访问windows共享文件夹windows11
如果移动设备和windows电脑都在同一个局域网内,可以用移动设备访问windows11的共享文件夹 1、设置共享文件夹 2、添加everyone用户即可 3、查看ip地址 4、在华为手机上点击文件管理,里面有个网上邻居 5、正常情况下,华为手机会扫描到同一局域…...
网络安全三防指南:只防病毒不安全
5月17日,瑞星全球反病毒监测网截获一个恶性病毒,由于该病毒的破坏能力和当年著名的CIH病毒几乎完全一样,因此瑞星将该病毒命名为“新CIH”病毒。被“新CIH”感染的电脑,主板和硬盘数据将被破坏,致使电脑无法启动&#…...
论文概览 |《Urban Analytics and City Science》2023.05 Vol.50 Issue.4
本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年5月第50卷第4期的论文的题目和摘要,一共包括19篇SCI论文! 论文1 Data analytics and sustainable urban development in global cities 全球城市的数据…...
【ROS2】ROS2 C++版本 与 Python版本比较
ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录 一、功能包的构建方式二、功能包组织结构三、代码编写四、性能与效率五、兼容性六、应用场景 目前ROS开发主要使用 C 和 Python 语言,这里会分别实现并讲解。 相较于ROS1,ROS2的 C 和 Python …...
物联网射频识别和RFID开发(一):RFID基础—概念、应用
一、RFID的发展历史 二、RFID与物联网 (一)物联网与RFID的关系 物联网的基本思想是美国麻省理工学院在1999年提出的,其核心思想是为全球每个物品提供唯一的电子标识符。这种电子标识符就是现在经常提到的“电子产品编码(Electronic Product …...
JVM:即时编译器,C2 Compiler,堆外内存排查
1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…...
webpack5 的五大核心配置(二)
webpack主要构成部分: entry 入口output 出口loaders 转化器plugins 插件mode 模式devServer 开发服务器 webpack.config.js 配置文件基本格式 module.exports{//入口文件entry:{},//出口文件output:{},//module rules loadersmodule{};//插件plugins:[],//开发…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
