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

news2024/10/7 4:26:59

目录

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.coloradmin.cn/o/1788733.html

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

相关文章

计算机网络 —— 数据链路层(以太网)

计算机网络 —— 数据链路层&#xff08;以太网&#xff09; 什么是以太网以太网传输介质和拓扑结构的发展传输介质的发展&#xff1a;拓扑结构的发展&#xff1a; 10BASE-T 以太网适配器和MAC地址适配器&#xff08;Adapter&#xff09;MAC地址适配器与MAC地址的关系 MAC帧以太…

OpenCV中的圆形标靶检测——斑点检测算法(二)

前面的章节中我们已经大致介绍了算法流程,也对一些算法中用到的相关概念做了简要介绍,同时给出了算法调用的API,现在我们开始算法检测接口实现源码的分析。 1. 斑点的分组与加权 这里我们选择后者,先了解算法的处理流程,再分析各个模块的实现。算法流程图如下图所示,上一…

重生之 SpringBoot3 入门保姆级学习(10、日志基础与使用)

重生之 SpringBoot3 入门保姆级学习&#xff08;10、日志基础使用&#xff09; 3.1 日志基础3.2 使用日志3.2.1 基础使用3.2.2 调整日志级别3.2.3 带参数的日志 3.1 日志基础 SpringBoot 默认使用 SLF4j&#xff08;Simple Logging Facade for Java&#xff09;和 Logback 实现…

结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

C++标准模板(STL)- 迭代器库-迭代器适配器 - 逆序遍历的迭代器适配器

迭代器库-迭代器适配器 迭代器库提供了五种迭代器的定义&#xff0c;同时还提供了迭代器特征、适配器及相关的工具函数。 迭代器分类 迭代器共有五 (C17 前)六 (C17 起)种&#xff1a;遗留输入迭代器 (LegacyInputIterator) 、遗留输出迭代器 (LegacyOutputIterator) 、遗留向…

2024年城市建设与环境管理国际会议(ICUCEM 2024)

2024 International Conference on Urban Construction and Environmental Management 【1】大会信息 大会地点&#xff1a;中国成都 投稿邮箱&#xff1a;icucemsub-paper.com 【2】会议简介 2024年城市建设与环境管理国际会议是一个专注于探讨城市建设与环境管理前沿议题…

#02 安装指南:如何配置Stable Diffusion环境

文章目录 前言前置条件第1步&#xff1a;安装Python和PIP第2步&#xff1a;创建虚拟环境第3步&#xff1a;安装PyTorch和CUDA第4步&#xff1a;安装Stable Diffusion相关库第5步&#xff1a;测试环境结论 前言 在之前的文章中&#xff0c;我们介绍了Stable Diffusion基础入门和…

【ArcGIS微课1000例】0114:基于DEM地形数据整体抬升或下降高程

相关阅读:【GlobalMapper精品教程】083:基于DEM整体抬升或下降地形高程的两种方式 文章目录 一、任务分析二、栅格计算器简介三、地形整体修改四、注意事项一、任务分析 打开软件,加载配套实验数据中的0112.rar中的dem数据,如下所示,dem的高程范围为256.75~342.37米,现在…

QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox&#xff0c;可参见下面这篇文章 QT之动态加载下拉框&#xff08;QComboBox&#xff09; 同理QTreeWidget也可以实现动态加载&#xff0c;在一些异步加载数据&#xff0c;并且数据加载比较耗时&#xff0c;非常实用。 效果 原理分析 要实现此类效…

618精选网络安全书单:打造数字世界的钢铁长城!

文章目录 《内网渗透实战攻略》《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》《CTF那些事儿》《权限提升技术&#xff1a;攻防实战与技巧》《数字政府网络安全合规性建设指南&#xff1a;密码应用与数据安全》《红蓝攻防&#xff1a;构建实战化网络安全防御体系…

ECharts 图形化看板 模板(简单实用)

目录 一、官网 二、模板 ①定义请求​编辑 ② 将请求统一管理&#xff0c;别的页面引用多个请求时更便于导入。​编辑 ③最终模板 三、执行效果 四、后端代码 4.1 controller 4.2 xml 4.3 测试接口 一、官网 获取 ECharts - 入门篇 - 使用手册 - Apache ECharts 二、…

医疗器械网络安全风险管理的基本步骤

医疗器械网络安全风险管理是一个复杂的过程&#xff0c;涉及到多个环节和步骤。以下是一些基本的步骤和关键点&#xff1a; 风险识别&#xff1a;首先需要对医疗器械的软件、网络连接和通信协议等进行漏洞分析&#xff0c;识别潜在的安全漏洞和弱点。这可能涉及对设备的渗透测…

佛教祭拜小程序-寺庙小程序-纪念馆小程序

大家好&#xff0c;我是程序员小孟。 现在有很多的产品或者工具都开始信息话了&#xff0c;寺庙或者佛教也需要小程序吗&#xff1f; 当然了&#xff01; 前面我们还开发了很多寺庙相关的小程序&#xff0c;都有相关的介绍&#xff1a; 1,优质的寺庙小程序-H5寺庙网页 今天…

jmeter常用的断言

包括&#xff08;Contains&#xff09;&#xff1a;响应内容包括需要匹配的内容即代表响应成功&#xff0c;支持正则表达式 匹配&#xff08;Matches&#xff09;&#xff1a;响应内容要完全匹配需要匹配的内容即代表响应成功&#xff0c;大小写不敏感&#xff0c;支持正则表达…

2. redis配置文件解析

redis配置文件解析 一、redis配置文件1、监听地址2、监听端口3、redis接收请求的队列长度3.1 修改系统参数/内核参数 4、客户端空闲的超时时间5、指定redis的pid文件6、定义错误日志7、定义数据库的数量8、定义持久化存储9、设置redis密码10、redis并发连接11、最大内存策略 二…

python的一种集成开发工具:PyCharm开发工具

一. 简介 本文简单了解两种 python语言所使用的 集成开发环境&#xff1a; PyCharm、vscode。 python语言学习中&#xff0c;可以任意选中这两个集成开发环境的一种就可以。本文先来简单学习 PyCharm开发工具安装与使用。 二. python的一种集成开发工具&#xff1a;PyChar…

Warning:成交前,永远相信意外即将发生

作为一名首次次创业者&#xff0c;随着创业进入深层次阶段&#xff0c;越来越感觉到&#xff1a;创业是一条不归路&#xff0c;因为路上不止有惊喜&#xff0c;还有风尘。创业之前我认为世界是“天圆地方”的&#xff0c; 创业后你猜我怎么看这个世界的&#xff1f; 创业前我一…

ARM32开发——串口库封装(初级)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 开发流程分组创建 接口定义完整代码 开发流程 在文件系统中&#xff0c;创建库目录Library在keil工程中&#xff0c;创建分组管理…

健身日记之倒立俯卧撑学习——起始日2024.6.4

文章目录 前言 自我介绍 昔日计划 新目标计划 瓶颈突破尝试 参考视频及文章 前言 有轻微健身基础&#xff0c;正式接触街健五大神技&#xff0c;立志在两年内解锁全部&#xff0c;将有机会的进行日常训练和目标肌群锻炼&#xff0c;这里向大家展示我的计划和安排&#xf…

【C++练级之路】【Lv.24】异常

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、异常的概念及定义1.1 异常的概念1.2 异常的定义 二、异常的使用2.1 异常的栈展开匹配2.2 异常的重新…