题目:
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;
}