今日份动态规划学习(二维01背包+01背包变形)

目录

P1877 [HAOI2012] 音量调节


P1877 [HAOI2012] 音量调节

题解:一个入门级别的01背包问题,首先就是为什么能看出是01背包,因为只有两种状态,要不增大音量,要不减小音量,和01背包的选与不选非常近似。但是我们的dp数组该如何去设置,用dp[n]去表示第n次操作之后的音量最大值吗?然后遍历n,每次走两种情况,这样不就活生生玩成递归了·,肯定会超时 那么我们该如何去做呢?我们可以考虑用dp数组去记录状态,判断是否能达到这一状态,能达到就是1,不能打到就是0,因此我们可以设一个二维dp数组dp[i][j]表示对于第i首歌,j这个音量能否达到,然后就是我们的状态转移方程

如果   j+c[i]<=maxLevel   说明我们就算加音量也不会超过最大值,因此可以达到dp[i][j+c[i]]这个状态

如果   j-c[i]<=maxLevel   说明我们就算减小音量也不会低于0,因此可以达到dp[i][j-c[i]]这个状态

还有一个注意点是如果无法避免低于0或者高于maxLevel那么就输出-1

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int start,maxn;
int c[55];
int dp[55][1005];signed main()
{cin>>n>>start>>maxn;for(int i=1;i<=n;i++)cin>>c[i];dp[0][start]=1;for(int i=1;i<=n;i++){for(int j=0;j<=maxn;j++){if(dp[i-1][j]==1&&j+c[i]<=maxn)dp[i][j+c[i]]=1;if(dp[i-1][j]==1&&j-c[i]>=0)dp[i][j-c[i]]=1;}}for(int i=maxn;i>=0;i--){if(dp[n][i]==1){cout<<i;return 0;}}cout<<"-1";return 0;
}

P1507 NASA的食物计划

题解:非常标准的二维01背包类问题 (主要体现在需要考虑两个变量的范围,这个里面是体积和质量)(一般这种题数据都很小,如果数据大一定会有缩小数据的办法)

给你n个物品,每个物品有其体积,质量和卡路里,然后我的背包有最大能装的体积和质量,问你最多能装多少卡路里的食物

我们可以用一个三重循环,第一层循环用来遍历物品,第二层用来其中一个条件,第三层用来遍历另一个条件

#include<bits/stdc++.h>
using namespace std;
#define int long long
int H,T;
int n;
int h[55];
int t[55];
int K[55];
int dp[405][405];
signed main()
{cin>>H>>T;cin>>n;for(int i=1;i<=n;i++){cin>>h[i]>>t[i]>>K[i];}dp[0][0]=0;for(int i=1;i<=n;i++){for(int j=H;j>=h[i];j--)//遍历体积{for(int k=T;k>=t[i];k--)//遍历质量{dp[j][k]=max(dp[j][k],dp[j-h[i]][k-t[i]]+K[i]); }}}cout<<dp[H][T];return 0;
}

 P1910 L 国的战斗之间谍

题解,和上面那道题一样标准的二维01背包思路,有两个限制范围,用两个循环去卡

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,x;
int a[105];//得到多少资料 
int b[105];//伪装数,和应该小于m 
int c[105];//雇佣金额 
int dp[1005][1005];signed main()
{cin>>n>>m>>x;for(int i=1;i<=n;i++){cin>>a[i]>>b[i]>>c[i];}dp[0][0]=0;for(int i=1;i<=n;i++){for(int j=m;j>=b[i];j--){for(int k=x;k>=c[i];k--){dp[j][k]=max(dp[j][k],dp[j-b[i]][k-c[i]]+a[i]);}}}cout<<dp[m][x];return 0;
}

 P1855 榨取kkksc03

题解:将正常的求最大价值变成求最大数量问题,只需要在状态转移方程上改变一下即可

状态转移方程:

dp[j][k]=max(dp[j][k],dp[j-m[i]][k-t[i]]+1); 

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,M,T;
int m[105];
int t[105];
int dp[205][205];signed main()
{cin>>n>>M>>T;for(int i=1;i<=n;i++)cin>>m[i]>>t[i];dp[0][0]=0;for(int i=1;i<=n;i++){for(int j=M;j>=m[i];j--){for(int k=T;k>=t[i];k--){dp[j][k]=max(dp[j][k],dp[j-m[i]][k-t[i]]+1);}}}cout<<dp[M][T];return 0;
}

P3985 不开心的金明

 

题解:这题是我今天要重点说的一道题 ,这题一看问题,01背包秒了,一看数据,蛙趣,这是01背包?这数据是不是太大了,然后后面我就看到了一些大佬无敌题解

我们既然数据这么大,但是我需要的就是极差在3以内的,因此我们就可以先在数组里面找到数组里面的最小值,然后将数组里面的每一个价格都减去这个最小值然后再+1,这样我们就可以压缩价格,这个数组里面的最小价格一定为1,然后找到这个数组里面在极差在3以内的最小价值,即可,然后就是一些细节,具体可以看代码(反正这个压缩空间的思想一定要学到

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,w;
int m[105];
int p[105];
int dp[405][105];//表示修改后的总价值为i,选了j个的最大重要度 
int sumv;//用来统计总的价格 
int minv=0x3f3f3f3f3f3f3f3f;//用来找到最小的价格 signed main()
{cin>>n>>w;for(int i=1;i<=n;i++){cin>>m[i]>>p[i];minv=min(minv,m[i]);sumv+=m[i];}minv-=1;//将物品的价格变成从1开始,不会超出数组范围 for(int i=1;i<=n;i++){m[i]-=minv;//缩小价格数值 }sumv-=n*minv;//总的价值也要相应的减去 for(int i=1;i<=n;i++)//遍历物品数量 {for(int j=sumv;j>=m[i];j--)//遍历价值,因为有可能都能选,所以最大价值是sumv {for(int k=n;k>=1;k--)//遍历选了多少个 {if(j+k*minv<=w)//如果现在选的价值,加上选的个数乘以一开始减去的价值小于最大要求价值,就可以进行状态转移,增加重要度 {dp[j][k]=max(dp[j][k],dp[j-m[i]][k-1]+p[i]);}}}} int ans=0;//去找出最大的重要度 for(int j=1;j<=sumv;j++){for(int i=1;i<=n;i++){ans=max(ans,dp[j][i]);}}cout<<ans;return 0;
}

 

最后是一道压轴题,难度不是很大,但是很难想到状态转移方程,以及处理条件

P1156 垃圾陷阱

肯定是01背包,对于每种垃圾我们都有两种操作,要么吃了,要么成为牛的垫脚石,让他从井里面出来

首先这题我们dp数组的定义为当垃圾的高度来到 i 时的能活到的最长时间为dp[i]

然后就可以想办法找出状态转移方程:有关是否要吃这个垃圾

dp[j+a[i].h]=max(dp[j+a[i].h],dp[j]);//不吃的生命 

dp[j]+=a[i].f;//吃的生命 

然后就可以AC了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int d,n;
int t[105];
int f[105];
int h[105];struct node{int t;int f;int h;
}a[105];
int w[105];//计算时间花销的 
int dp[105];//对于高为i的生命为dp[i] bool cmp(node x,node y)
{return x.t<y.t;
}signed main()
{cin>>d>>n;for(int i=1;i<=n;i++){cin>>a[i].t>>a[i].f>>a[i].h;}sort(a+1,a+1+n,cmp);dp[0]=10;//一开始能存活的最大时间为题目中的10个小时 for(int i=1;i<=n;i++){for(int j=d;j>=0;j--){if(dp[j]>=a[i].t){if(a[i].h+j>=d)//是否能够逃出深井 {cout<<a[i].t;return 0;}dp[j+a[i].h]=max(dp[j+a[i].h],dp[j]);//不吃的生命 dp[j]+=a[i].f;//吃的生命 }}}cout<<dp[0];//出不去的情况输出最多能存活多长时间 return 0;
}

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

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

相关文章

酱菜产业:传承美味,点亮生活

酱菜&#xff0c;这道深受人们喜爱的传统美食&#xff0c;以其独特的风味和营养价值&#xff0c;点亮了我们的日常生活。酱菜产业作为美食文化的重要组成部分&#xff0c;正以其独特的魅力&#xff0c;吸引着越来越多的消费者。 酱菜产业的赵总说&#xff1a;酱菜的制作过程&am…

C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

数据库(24)——外键约束

概念 外键用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 具有外键的表称为子表&#xff0c;关联的表称为父表。 语法 添加外键 CREATE TABLE 表名( 字段名 数据类型, .. [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主…

CGS与MGS的矩阵正交化-C语言实现

格拉姆-施密特正交化和改进的格拉姆-施密特正交化 格拉姆-施密特正交化CGS 数学公式 代码实现&#xff1a; 过程版 矩阵运算实现的难点在于每次运算都是一个向量&#xff0c;需要for循环进行&#xff0c;会带来运算时在代码中的复杂&#xff0c;进而难以理解代码的过程 Q矩阵…

软件测试——白盒测试

目录 学习视频来源&#xff1a;1.01什么是白盒测试(Av809778070,P1)_哔哩哔哩_bilibili 1.语句覆盖 2.判定覆盖 3.条件覆盖 4.判定条件覆盖 5.条件组合覆盖 6.路径覆盖 7.基本路径覆盖 学习视频来源&#xff1a;1.01什么是白盒测试(Av809778070,P1)_哔哩哔哩_bilibili …

正则表达式运用

已经写了表达式&#xff0c;下一步就是匹配字符串得到结果 使用matcher的源码&#xff08;匹配&#xff09;普通方法&#xff0c;find&#xff08;寻找&#xff09;合适的代码&#xff0c;看字符串是否匹配成功 是否可以匹配上 匹配么&#xff0c;匹配就留下&#xff0c;fin…

性能工具之 JMeter 常用组件介绍(三)

文章目录 一、常用组件介绍二、Sampler&#xff1a;取样器三、Controller:控制器&#xff08;逻辑控制器&#xff09;四、Pre Processor:预处理五、Post Processor:请求之后的处理六、Assertions:断言七、Timer:定时器八、Test Fragment&#xff1a;片段九、Config Element:配置…

STM32 SPI驱动读取LSM6DSRTR

提示&#xff1a;通过SPI驱动读取传感器数据 文章目录 前言一、LSM6DSRTR二、配置步骤1.配置SPI2.引入 LSM驱动库3.结果 总结 前言 制作一个倾角传感器&#xff0c;通过SPI读取LSM6DSRTR的加速度数据转换为角度&#xff0c;不用IIC的原因是考虑IIC通讯的协议过于繁琐&#xff…

springCloudAlibaba之服务熔断组件---sentinel

sentinel组件学习 sentinel学习sentinel容错机制使用代码方式进行QPS流控-流控规则初体验使用SentinelResource注解进行流控使用注解方式 sentinel学习 服务雪崩 服务雪崩效应&#xff1a;因服务提供者的不可用导致服务调用者的不可用&#xff0c;并将不可用逐渐放大的过程。 …

心链10----查询修改加入队伍业务实现

心链 — 伙伴匹配系统 接口设计 查询队伍列表 :::success 分页展示队伍列表&#xff0c;根据名称、最大人数等搜索队伍 P0&#xff0c;信息流中不展示已过期的队伍 从请求参数中取出队伍名称等查询条件&#xff0c;如果存在则作为查询条件不展示已过期的队伍&#xff08;根…

docker实战命令大全

文章目录 1 环境准备1.1 移除旧版本Docker1.2安装工具包1.3配置docker yum源 2 安装最新docker2.1 设置开机自启docker2.2配置加速器 3 实操-镜像3.1搜索镜像3.2下载镜像3.3查看镜像3.4 删除镜像 4 实操-容器4.1运行nginx容器4.2 查看容器4.3启动容器4.5关闭容器4.6查看容器日志…

分布式光纤测温DTS与光纤光栅FBG解调仪有什么区别?

分布式光纤测温DTS和光纤光栅FBG解调仪之间存在本质区别。分布式光纤测温DTS是一种完全分布式的温度监测技术&#xff0c;意味着光纤的整个长度都充当传感器&#xff0c;可以感知任何位置的温度变化。然而&#xff0c;由于空间分辨率的限制&#xff0c;目前国内外的大多数技术只…

Three.js中的Raycasting技术:实现3D场景交互事件的Raycaster详解

前言 在Web开发中&#xff0c;Three.js是一个极为强大的库&#xff0c;它让开发者能够轻松地在浏览器中创建和展示3D图形。随着3D技术在网页设计、游戏开发、数据可视化等领域的广泛应用&#xff0c;用户与3D场景的交互变得日益重要。而要实现这种交互&#xff0c;一个核心的技…

探索地产营销管理系统业务架构的设计与应用

随着城市化进程的加速和人们对居住环境需求的不断提升&#xff0c;地产行业正迎来前所未有的发展机遇和挑战。在这个背景下&#xff0c;地产营销管理系统作为地产开发企业营销管理的重要工具&#xff0c;扮演着至关重要的角色。本文将深入探讨地产营销管理系统业务架构的设计与…

手机怎么压缩图片?通过三种压缩操作

手机怎么压缩图片&#xff1f;在智能手机日益普及的今天&#xff0c;拍照分享已成为日常生活的一部分。然而&#xff0c;高质量的照片往往占用较大的存储空间&#xff0c;且在网络上传输时速度较慢。那么&#xff0c;如何在手机上压缩图片呢&#xff1f;本文将介绍三种实用的手…

文件无法在当前环境下执行在 x86_64 系统上运行 ARM 可执行文件

目录 遇到的问题是由于"..."文件无法在当前环境下执行。这个错误通常是因为二进制文件的格式不兼容&#xff0c;可能是因为它是为不同的架构编译的。例如&#xff0c;如果二进制文件是为 x86 架构编译的&#xff0c;但你在 ARM 设备上尝试运行它&#xff0c;就会出现…

[数据集][目标检测]道路圆石墩检测数据集VOC+YOLO格式461张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;462 标注数量(xml文件个数)&#xff1a;462 标注数量(txt文件个数)&#xff1a;462 标注类别…

运放应用2 - 同相放大电路

1. 前置知识 同相放大电路存在 负反馈电路 &#xff0c;工作在线性区&#xff0c;可以利用 虚短 概念来分析电路。 注&#xff1a;运放的 虚断 特性是一直存在的&#xff0c;虚短 特性则需要运放工作在 线性区 有关运放的基础知识&#xff0c;可以参考我的另外一篇文章&#x…

LeetCode题练习与总结:杨辉三角--118

一、题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1…

单元测试之CppTest测试框架

目录 1 背景2 设计3 实现4 使用4.1 主函数4.2 测试用例4.2.1 定义4.2.2 实现 4.3 运行 1 背景 前面文章CppTest实战演示中讲述如何使用CppTest库。其主函数如下&#xff1a; int main(int argc, char *argv[]) {Test::Suite mainSuite;Test::TextOutput output(Test::TextOut…