JZOJ 1362. 【2011.12.31普及模拟】堆箱子(boxes)

本文针对如何通过01背包算法解决箱子堆叠问题进行了详细解析,通过对箱子的长、宽、高的灵活转换,并利用选排法,实现了箱子堆叠高度的最大化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

http://blog.youkuaiyun.com/qq_35786326/article/details/79191181

题意:

求如何排放箱子,才能使高度最大化

分析:

这一题,明显为01背包,题目也丝毫不含蓄地透露给了我们,但本题的难点也是有的。首先是有长、宽
两个条件,这一点还算好解决,但下一个,就需要多加留心才能发现:长、宽、高是可以随意互换的!但还好作者
留了些情,将数据范围设到了100以内,所以我们可以直接使用选排。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
inline LL read() {
	LL d=0,f=1;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
	return d*f;
}
int h[601],n,a[601],b[601],c[601];
int maxt,t;
int max(int x,int y)
{
	return x>y? x:y;
}
int main()
{
	freopen("boxes.in","r",stdin);
	freopen("boxes.out","w",stdout);
	int x,y,g;
	n=read();n*=6;
	for(int i=1;i<=n;i+=6)
	{
		x=read();y=read();g=read();
		a[i]=x;b[i]=y;c[i]=g;//因为长、宽、高是可以随意互换的,所以我们可以先做一个预处理
		a[i+1]=x;b[i+1]=g;c[i+1]=y;	
		a[i+2]=y;b[i+2]=x;c[i+2]=g;	
		a[i+3]=y;b[i+3]=g;c[i+3]=x;	
		a[i+4]=g;b[i+4]=x;c[i+4]=y;	
		a[i+5]=g;b[i+5]=y;c[i+5]=x;	
	}
	for(int i=1;i<n;i++)
	  for(int j=0;j<n-i;j++)
	    if(a[j]>a[j+1])//先按照一个条件的大小进行排序
	    {
	    	swap(a[j],a[j+1]);
	    	swap(b[j],b[j+1]);
	    	swap(c[j],c[j+1]);
	    }
	h[0]=c[0];//初始化
	for(int i=1;i<n;i++)
	{
		 h[i]=c[i];//枚举当h[i]在最上面时
		 for(int j=i-1;j>=0;j--)
		   if(a[i]>a[j]&&b[i]>b[j])//当两个条件符合要求时,判断是否大于原排列的高度
		     h[i]=max(h[i],h[j]+c[i]);
		maxt=max(maxt,h[i]);
	}
	printf("%d",maxt);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值