首页 > 其他分享 >Living-Dream 系列笔记 第78期

Living-Dream 系列笔记 第78期

时间:2024-09-11 22:13:45浏览次数:7  
标签:Living 背包 cur int cin 01 Dream dp 78

常用 dp 状态:\(dp_i\) 表示以 \(i\) 结尾的 XXX / 前 \(i\) 个元素的 XXX。

涉及的类型(由易到难):线性 dp,背包,区间 dp,树形 dp(换根 dp),状压 dp,dp 的各类优化(数据结构优化、斜率优化、四边形不等式优化......)。

背包问题:01 背包、完全背包、分组背包、多重背包、树上背包。

P1455

并查集维护配套,按照所有套餐进行 01 背包即可。

总结:本题是并查集与 01 背包的结合,具有综合性。

code
#include<bits/stdc++.h>
using namespace std;

const int N=1e4+5;
int n,m,w;
int c[N],d[N];
int p[N],fa[N],dp[N];

int fnd(int x){
	return (fa[x]==x?x:fa[x]=fnd(fa[x]));
}
void uni(int x,int y){
	x=fnd(x),y=fnd(y);
	if(x!=y){
		fa[x]=y;
		c[y]+=c[x];
		d[y]+=d[x];
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m>>w;
	for(int i=1;i<=n;i++)
		cin>>c[i]>>d[i],fa[i]=i;
	for(int i=1,u,v;i<=m;i++)
		cin>>u>>v,uni(u,v);
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(fa[i]==i)
			p[++cnt]=i;
    }
	for(int i=1;i<=cnt;i++)
		for(int j=w;j>=c[p[i]];j--)
			dp[j]=max(dp[j],dp[j-c[p[i]]]+d[p[i]]);
	cout<<dp[w];
	return 0;
}

CF507A

定义 \(path_{i,j}\) 记录背包容量为 \(j\) 时物品 \(i\) 是否转移成功,每次转移时标记即可。

最后递归地寻找答案,具体见代码。

总结:本题是记录决策点的 01 背包,以后要求记录决策点的 dp 都可以仿照着这样写。

code
#include<bits/stdc++.h>
using namespace std;

const int N=1e2+5,K=1e4+5;
int n,k,cnt;
int c[N],dp[K],ans[N];
bool path[N][K];

void getans(int cur,int l){
    if(!cur)
        return;
    if(path[cur][l]){
        ans[++cnt]=cur;
        getans(cur-1,l-c[cur]);
    }
    else
        getans(cur-1,l);
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>c[i];
	for(int i=1;i<=n;i++){
		for(int j=k;j>=c[i];j--){
			if(dp[j]<dp[j-c[i]]+1){
				dp[j]=dp[j-c[i]]+1;
                path[i][j]=1;
			}
		}
	}
	getans(n,k);
    cout<<cnt<<'\n';
    for(int i=1;i<=cnt;i++)
        cout<<ans[i]<<' ';
	return 0;
}

AT_abc054_d

既然有两种类型的物品,我们就设两维,令 \(dp_{i,j}\) 表示选重量为 \(i\) 的 A 元素且选重量为 \(j\) 的 B 元素所能获得的最大价值。仍然像 01 背包一样转移即可。

最后,我们枚举所有状态,对于所有满足要求的状态取最小值即可。

总结:本题是具有多个维度的 01 背包。谨记:当存在多个物品时,考虑增设维度。

code
#include<bits/stdc++.h>
using namespace std;

const int N=5e2+5;
int n,ma,mb,sa,sb;
int a[N],b[N],c[N];
int dp[N][N];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>ma>>mb;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i]>>c[i];
		sa+=a[i],sb+=b[i];
	}
	memset(dp,0x3f,sizeof dp);
	dp[0][0]=0;
	for(int i=1;i<=n;i++)
		for(int j=sa;j>=a[i];j--)
			for(int k=sb;k>=b[i];k--)
				dp[j][k]=min(dp[j][k],dp[j-a[i]][k-b[i]]+c[i]);
	int ans=1e9;
	for(int i=1;i<=sa;i++)
		for(int j=1;j<=sb;j++)
			if(j*ma==i*mb)
				ans=min(ans,dp[i][j]);
	cout<<(ans==1e9?-1:ans);
	return 0;
}

AT_abc118_d

首先这显然是个完全背包,我们先按照完全背包的方式做,令 \(dp_i\) 表示用 \(i\) 根火柴能拼成的最大位数。

显然,位数越大越好,位数相同的情况下数码越大越好,所以我们将 \(a\) 先排个序。

然后从 \(n\) 开始(这样保证了位数最大),每次在 \(m\) 个数码中选取能拼成 \(dp_n\) 这么多位且当前这一位为 \(a_i\) 的最大的那个 \(a_i\),记录下它即可。

总结:本题是完全背包与贪心的结合,这启发我们可以在 dp 之后贪心选取最优方案,这两个东西并不是水火不容。

code
#include<bits/stdc++.h>
using namespace std;

const int N=1e4+5;
const int num[]={0,2,5,5,4,5,6,3,7,6};
int n,m,tot;
int a[N],dp[N],ans[N];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>a[i];
    memset(dp,0xcf,sizeof dp);
    dp[0]=0;
	for(int i=1;i<=m;i++)
		for(int j=num[a[i]];j<=n;j++)
			dp[j]=max(dp[j],dp[j-num[a[i]]]+1);
	//int cur=dp[n];
	sort(a+1,a+m+1);
	while(n){
        //cout<<cur<<'\n';
		int p=0;
		for(int i=1;i<=m;i++)
			if(n>=num[a[i]]&&dp[n-num[a[i]]]+1==dp[n])
				p=i;
		n-=num[a[p]];
		ans[++tot]=a[p];
	}
	for(int i=1;i<=tot;i++)
		cout<<ans[i];
	return 0;
}

CF632E

正解是 FFT / NTT,但是朴素完全背包也可以过。

这题并不要求最大价值,于是我们换一种状态定义:令 \(dp_i\) 表示凑成价值为 \(i\) 需要的最少商品数,转移 \(dp_i=\min(dp_i,dp_{i-a_j}+1)\),这样方便统计答案。

但是题目需要恰好取 \(k\) 件商品,于是我们可以将每个物品的价值全都减去最小的那个商品的价值,这样任意商品数 \(\le k\) 的方案都可以通过不断加上最小的那个商品从而凑成 \(k\) 个,之后在加回去就可以了。

总结:本题是完全背包的变种,且用到了一个小技巧。我们必须要依据题目关心的东西来设计状态。

code
#include<bits/stdc++.h>
using namespace std;

const int N=1e6+5;
int n,k,mx,mn=1e9;
int a[N],dp[N];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mn=min(mn,a[i]);
		mx=max(mx,a[i]);
	}
	mx-=mn;
	for(int i=1;i<=n;i++)
		a[i]-=mn;
	memset(dp,0x3f,sizeof dp);
	dp[0]=0;
	for(int i=0;i<=k*mx;i++)
		for(int j=1;j<=n;j++)
			if(i>=a[j])
				dp[i]=min(dp[i],dp[i-a[j]]+1);
	for(int i=0;i<=k*mx;i++)
		if(dp[i]<=k)
			cout<<i+k*mn<<' ';
	return 0;
}

标签:Living,背包,cur,int,cin,01,Dream,dp,78
From: https://www.cnblogs.com/XOF-0-0/p/18409113

相关文章

  • Living-Dream 系列笔记 第77期
    拖更了一个暑假。P6492很妙的线段树阿。对于修改,我们无需用lazytag,只要每次跑到叶子节点去直接修改即可。对于询问,答案即为树根的信息,因为它每次询问的都是整个区间。最难的是pushup部分:我们需要维护三个东西,ans,lx,rx,分别表示当前节点的整个串的最长合法串/左端点开......
  • CF786B 题解
    题意洛谷题面传送门现有一个图,有\(n\)个节点,从节点\(s\)出发,求到\(n\)个点每一个点的最短路。其中,有三种建边方式:建一条从\(u\)到\(v\)的单向边。从节点\(v\)分别向\([l,r]\)的每个结点连一条边。从节点\([l,r]\)向节点\(v\)连边芝士线段树优......
  • 线段树 transformation——hdu 4578
    问题描述:给定一个数列,数列中所有元素都初始化为0,对其执行多种区间操作操作1:add修改:对区间[L,R]内的所有数加c操作2:multi修改:对区间[L,R]内所有数乘以c操作3:change操作:把区间[L,R]内所有数改为c操作4:sum操作:对区间中的每个数的p次方求和。1<=p<=3输入:有不超过10个测试用例。......
  • 合宙低功耗4G模组Air780EX——硬件设计手册02
    在上文我们介绍了合宙低功耗4G模组Air780EX的主要性能和应用接口,本文我们将继续介绍Air780EX的射频接口,电气特性,实网功耗数据,结构规格等内容。Air780EX   是4G全网通模块,可适应不同的运营商和产品,确保产品设计的最大灵活性。 Air780EX采用移芯EC618平台,支持LTE 3GPP Rel.13 ......
  • 【连续多年EI检索,去年EI检索只需2.5个月!学生易中稿,性价比超高!SPIE出版 (ISSN号: 0277-
    由重庆理工大学、重庆市特种设备检测研究院和重庆市电子学会联合主办,重庆邮电大学、韩国仁荷大学、重庆工程学院、重庆能源职业学院协办,光纤传感与光电检测重庆市重点实验室、现代光电检技术与仪器重庆市高校重点实验室、西部复杂环境机电设备安全国家市场监管重点实验室、智能......
  • 合宙低功耗4G模组Air780EX——硬件设计手册01
    Air780EX是一款基于移芯EC618平台设计的LTECat1无线通信模组。支持FDD-LTE/TDD-LTE的4G远距离无线传输技术。另外,模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。一、主要性能1.1 模块功能框图1.2 模块型号列表1.3 模块主要性能 *注:模组工作在-40°C~-35°C......
  • 创新体验来袭,智象未来(HiDream.ai)开启电商多模态交互新时代
    立足人工智能技术的前沿领域,智象未来(HiDream.ai)不断深化其多模态生成式技术的研发,引领着全球创新的潮流。公司成功构建了视觉多模态基础模型及其应用,为交互式智能内容创作设立了全新的行业标杆。智象未来(HiDream.ai)独立开发的“秩象大模型”具备跨文本、图像、视频、3D等多种模......
  • 合宙4G模组Air780E开发板使用手册
    CORE-AIR780E开发板是基于Air780E模组所开发的,包含电源,SIM卡,USB,天线,音频等必要功能的最小硬件系统。以方便用户在设计前期对Air780E模块进行性能评估,功能调试,软件开发等用途。一、开发板配置 一代IPEX天线连接器(选配)4G弹簧天线一个下载/调试串口,两个通用串口IO口默认电平......
  • Springboot“科教兴国”支教门户网站rp778程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,支教介绍,支教新闻,招聘信息,职位申请,志愿者活动,活动报名,募捐信息,捐赠信息,支教教师,支教学生,科教职位开题报告内容一、项目背景在“科教兴国”战略......
  • Adobe Dreamweaver DW WIM/MAC下载安装及常用快捷键 (网站开发和管理)
    目录一、软件概述1.1软件简介1.2适用人群1.3主要特性二、安装步骤2.1下载软件2.2安装准备2.3安装过程三、常用快捷键3.1文件操作3.2编辑操作3.3导航与视图一、软件概述1.1软件简介AdobeDreamweaver是AdobeSystems开发的一款集网页设计、网站开......