BZOJ 1933 Bookcase 书柜的尺寸

Description

Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书。Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了。显然,这种书柜不能太大,Tom希望它的体积越小越好。另外,出于他的审美要求,他只想要一个三层的书柜。为了物尽其用,Tom规定每层必须至少放一本书。现在的问题是,Tom怎么分配他的工具书,才能让木匠造出最小的书柜来呢? Tom很快意识到这是一个数学问题。每本书都有自己的高度hi和厚度ti。我们需要求的是一个分配方案,也就是要求把所有的书分配在S1、S2和S3三个非空集合里面的一个,不重复也不遗漏,那么,很明显,书柜正面表面积(S)的计算公式就是: 由于书柜的深度是固定的(显然,它应该等于那本最宽的书的长度),所以要求书柜的体积最小就是要求S最小。Tom离答案只有一步之遥了。不过很遗憾,Tom并不擅长于编程,于是他邀请你来帮助他解决这个问题。

Input

文件的第一行只有一个整数n(3≤n≤70),代表书本的本数。接下来有n行,每行有两个整数hi和ti,代表每本书的高度和厚度,我们保证150≤hi≤300,5≤ti≤30。

Output

只有一行,即输出最小的S。

Sample Input

4
220 29
195 20
200 9
180 30

Sample Output

18000

HINT

 

Source

Day2

F[I][J][K]表示操作到第i本书,第一层的书的厚度为J,第二层书的厚度为K,则第三层的厚度为SUM[I]-I-J,记录的是最小的高度。(按照高度从小到大排序,这样就没有后效性了) 时间复杂度O(70*2100*2100),空间复杂度O(2*2100*2100) 开滚动数组

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#define ll long long
#define maxn 4001000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PI 2*asin(1)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define SWAP(x,y,t) ( (t)=(x),(x)=(y),(y)=(t) )
using namespace std;
struct node{
	int h,t;
}a[1010];
int f[2][2110][2110];
int n,sum[1010],ans=10101010;
bool cmp(node a,node b)
{
	return a.h>b.h;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&a[i].h,&a[i].t);
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].t;
	memset(f,127/3,sizeof(f));
	f[0][0][0]=0;
	int sta=0;
	for(int i=1;i<=n;i++)
	{
		sta=!sta;
		memset(f[sta],127/3,sizeof(f[sta]));
		for(int j=sum[i-1];j>=0;j--)
			for(int k=sum[i-1];k>=0;k--)
			{
				if(j+k>sum[i-1]||f[!sta][j][k]>101010) continue;
				int t=a[i].t,h=a[i].h;
				
				if(j==0) f[sta][t][k]=min(f[sta][t][k],f[!sta][j][k]+h);
				else f[sta][j+t][k]=min(f[sta][j+t][k],f[!sta][j][k]);
				
				if(k==0) f[sta][j][t]=min(f[sta][j][t],f[!sta][j][k]+h);
				else f[sta][j][k+t]=min(f[sta][j][k+t],f[!sta][j][k]);
				
				if(sum[i-1]-k-j==0) f[sta][j][k]=min(f[sta][j][k],f[!sta][j][k]+h);
				else f[sta][j][k]=min(f[sta][j][k],f[!sta][j][k]);
			}
	}
	for(int i=1;i<sum[n];i++)
		for(int j=1;j<sum[n];j++)
	 		if(i+j<sum[n] && f[sta][i][j]<101010)
	 		    {
	    		ans=min(ans,max(max(i,j),sum[n]-i-j)*f[sta][i][j]);
	    		//printf("i=%d j=%d sum[n]=%d %d %d f[sta][i][j]=%d\n",i,j,sum[n],max(max(i,j),sum[n]-i-j)*f[sta][i][j],max(max(i,j),sum[n]-i-j),f[sta][i][j]);
	    	    }
	printf("%d\n",ans);

} 

 

内容概要:本文详细复现并实现了“电动汽车聚合可行域的内-外结合近似方法”的Matlab代码,旨在通过对大量电动汽车充放电能力的建模,构建其聚合可行域的内近似与外近似集合,从而科学刻画电动汽车集群作为柔性资源参与电网调度的整体潜力。研究基于多面体理论,系统阐述了电动汽车集群聚合建模的技术流程,并将其集成至包含分布式电源、储能系统及常规负荷的微电网经济调度模型中,验证该方法在提升系统运行经济性、灵活性与可再生能源消纳能力方面的有效性。文中不仅提供了完整的数学模型推导与优化框架,还深入分析了模型特性及其在虚拟电厂、车网互动(V2G)等新兴电力系统场景中的应用前景。; 适合人群:具备电力系统分析基础Matlab编程能力的研究生、科研人员,以及从事新能源并网、智能电网、需响应能源互联网相关领域的工程师与技术人员。; 使用场景及目标:①掌握基于多面体理论的电动汽车集群聚合建模方法,理解其作为“虚拟电池”参与系统调度的内在机理;②学习如何将海量异质个体的时空灵活性聚合为可操作的可行域,并应用于微电网或主动配电网的优化调度问题;③为开展车网互动(V2G)、分布式资源聚合、鲁棒调度、虚拟电厂等前沿课题的研究提供坚实的模型基础与可复用的代码参考。; 阅读建议:建议读者结合文中提供的Matlab代码,逐模块运行与调试,重点关注电动汽车个体可行域的构建、多面体聚合的内近似算法实现以及微电网调度模型中约束条件的耦合方式,鼓励通过修改参数、增删设备类型或扩展为多时段模型等方式进行二次开发,以深化对聚合机理与优化逻辑的理解。
内容概要:本文提出了一种基于QEG-RKRBMO算法的复杂三维战场环境下无人机路径规划方法,旨在解决高维、强约束空间中的航迹优化问题。通过构建融合地形起伏、静态障碍物、动态威胁区域及无人机自身动力学特性的综合数学模型,设计了兼顾路径长度、飞行安全性、能耗与机动平滑性的多目标综合评价函数,并引入多种群灰狼优化算法(CS-GWO)进行算法改进,有效提升了种群多样性与全局寻优能力,避免早熟收敛。文中系统阐述了三维决策空间建模、航迹编码机制、多层次约束条件体系以及基于修复策略的不可行解处理方法,同时给出了关键工程模块的实现细节,包括初始化策略、邻域搜索机制与收敛判据,并配套提供了完整的Matlab代码实现框架,充分验证了该方法在复杂三维场景下生成安全、高效、可行航迹的有效性与鲁棒性。; 适合人群:具备一定算法基础Matlab编程能力,从事无人机路径规划、智能优化算法研究或军事仿真领域的科研人员及研究生。; 使用场景及目标:①应用于复杂三维战场环境中多无人机协同避障与路径规划;②为高维约束优化问题提供基于群体智能算法的解思路与代码参考;③支持对灰狼优化算法及其他元启发式算法的改进与性能验证。; 阅读建议:建议结合文中提供的Matlab代码逐模块运行与调试,重点关注算法改进策略与约束处理机制的实现细节,同时可扩展应用于其他路径规划或优化调度场景中进行对比实验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值