今日份动态规划学习(二维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.mfbz.cn/a/679790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记——IP地址网络协议——IPV4地址配置与应用

五、IPV4地址配置与应用 1、IP地址的基础配置命令 2、案例&#xff1a;配置接口IP地址 3、Loopback接口 Loopback接口∶用户需要一个接口状态永远是Up的接口的IP地址时&#xff0c;可以选择Loopback接口的IP地址。 Loopback接口一旦被创建&#xff0c;其物理状态和链路协议状…

消防认证-饰面型防火涂料

一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准&#xff0c;且通过了国家认证认可监督管理委员会审批&#xff0c;获得消防认证资质的认证机构颁发的证书&#xff0c;消防产品具有完好的防火功能&#xff0c;是住房和城乡建设领域验收的重要指标。 二、认证依据…

【Linux】进程(5):命令行参数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;5&#xff09;&#xff1a;命令行参数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 &#xff08;A&#xff09;为什么要有命令…

JavaWeb基础(JQuery,XML及解析)

这个阶段有点拖沓了&#xff0c;因为事情比较多&#xff0c;耽搁了一段时间&#xff0c;学习的主要内容为JQuery和XML&#xff0c;因为vue的出现&#xff0c;JQuery技术现在已经不流行了&#xff0c;但是不流行不代表我不会&#xff0c;JQuery最最最最核心的就是他的$()核心函数…

阿里云sls 采集日志安装记录

参考阿里云给的安装文档 阿里云安装Logtail组件 注意这里&#xff0c;选择地域&#xff0c;是中国地域选中国&#xff0c;海外选海外即可 按照文档继续下去 修改配置文件./alibaba-cloud-log-all/values.yaml 所有的操作完成后&#xff0c;去控制台配置 以上操作的前提是…

数据可视化---使用matplotlib绘制高级图表(2)

题目一&#xff1a;绘制人口金字塔图 编写程序。根据第8.6&#xff0c;绘制如下图的人口金字塔图。 运行代码&#xff1a; #绘制人口金字塔图 import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] SimHei plt.rcParams[…

交互式流程图组件DHTMLX Diagram v6.0 - 拥有更灵活的高度可定制功能

DHTMLX Diagram库允许用几行代码构建JavaScript流程图&#xff0c;通过自动布局和实时编辑器&#xff0c;它可以更容易地将复杂数据可视化到一个整洁的层次结构中。 DHTMLX Diagram v6.0版本发布&#xff0c;带来了众多令人兴奋的新功能和改进&#xff0c;使得这个JavaScript图…

【SITS_CC】卫星图像时间序列的变化字幕(IEEE GRSL)

摘要 Satellite images time series (SITS) 提供了一种有效的方法来同时获取地球上观测区域的时间和空间信息。然而&#xff0c;传统的遥感CD方法的输出是二进制图或语义变化图&#xff0c;往往难以被最终用户解释&#xff0c;传统的遥感图像变化字幕方法只能描述双时图像。提…

ARM32开发——串口输出

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求串口数据发送串口打印实现复用功能串口发送流程&#xff08;了解&#xff09;串口的标志位关心的内容 需求 串口循环输出内容到…

AI生成PPT:一键式演示文稿制作的秘诀

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

java 原生http服务器 测试JS前端ajax访问实现跨域传post数据

后端 java eclipse 字节流转字符 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.i…

测试工具链

缺陷管理 bug管理工具 devops---项目管理--缺陷管理 bug管理地址 https://devsecops.mychery.com:8443/chery/project?filterROLE&statusACTIVE bug管理环境 采用公司的devops平台&#xff0c;对每个项目的bug进行管理。目前在使用 接口测试和服务端性能测试 工具…

Python-3.12.0文档解读-内置函数zip()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 基本用法 示例 特性 高级用法 注意事项 版本更新 示例代码 记忆策略…

「小明赠书活动」第五期“网安三剑客”套系图书《内网渗透技术》《渗透测试技术》《Web应用安全》

大模型风潮已掀起&#xff0c;各大巨头争相入局&#xff0c;从ChatGPT到Sora&#xff0c;全球的AI应用“卷出了花”。然而&#xff0c;网络安全人员在享受AI技术带来的便捷之余&#xff0c;也不得不面对一系列新兴的安全挑战&#xff0c;无法忽视。 ⭐️ 赠书 - 图书简介 人…

攻防世界---misc---Aesop_secret

1、下载附件一张动图&#xff0c;仔细观察发现它分成了很多小块&#xff0c;观察小块但是感觉又不像是二维码&#xff0c;可能需要把图片拼起来 2、用winhex分析&#xff0c;发现有一串编码&#xff0c;看编码的开头&#xff0c;猜测是AES加密 3、解码需要密码 4、想到刚刚的图…

MySQL——C语言连接数据库

MySQL Connection ​ 连接数据库的客户端除了命令行式的还有图形化界面版本&#xff0c;网页版本&#xff0c;当然也包括语言级别的库或者是包&#xff0c;能够帮助我们直接连接数据库&#xff1b; 一、语言连接库下载 方式一&#xff1a;不建议使用&#xff0c;需要自己配置…

RabbitMQ简介

一、安装和使用方式 1.https://www.erlang.org/ https://www.rabbitmq.com/ 2.先安装Erlang&#xff0c;管理员安装&#xff0c;在安装rabbitMQ&#xff0c;也是管理员安装&#xff0c;因为rabbitMQ是用Erlang语言开发的。且每个版本的RabbitMQ对应不同的Erlang版本&…

【深度学习】【机器学习】支持向量机,网络入侵检测,KDD数据集

文章目录 环境加载数据归一化数据训练模型用测试数据集给出评估指标准确率召回率预测某个输入数据随便取一行数据加载训练好的SVM支持向量机模型并预测 全部数据和代码下载 环境 之前介绍过用深度学习做入侵检测&#xff0c;这篇用向量机。 环境Python3.10 requirements.txt…

C++候捷stl-视频笔记3

算法的形式 Cmp通常是个比大小的准则&#xff0c;是Functor。 算法所需的信息通常指迭代器如何移动 迭代器的分类 array&#xff0c;vector&#xff0c;deque它们是连续的&#xff0c;它们的迭代器是Random Access Iterator/随机访问迭代器 list的迭代器是Bidirectional Itera…

如何微调出自己的大模型——LoRA原理解析

1、前言 上一篇文章&#xff0c;我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型&#xff0c;参数量及其之大。你没有足够的算力资源&#xff0c;就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型&#xff0c;那我们就想&#xff0c;是…