2015 HUAS Summer Trainning #5 B
Description
一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉。
研究人员有n种类型的砖块,每种类型的砖块都有无限个。第i块砖块的长宽高分别用xi,yi,zi来表示。 同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高。
在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的上面,因为必须留有一些空间让猴子来踩。
你的任务是编写一个程序,计算猴子们最高可以堆出的砖块们的高度。
Input
输入文件包含多组测试数据。
每个测试用例的第一行包含一个整数n,代表不同种类的砖块数目。n<=30.
接下来n行,每行3个数,分别表示砖块的长宽高。
当n= 0的时候,无需输出任何答案,测试结束。
Output
对于每组测试数据,输出最大高度。格式:Case 第几组数据: maximum height = 最大高度
Sample Input
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
题目大意:N个砖块的长宽高。每个的个数是无限个。要下面的砖块长宽要大于上面的。问你这些砖块最高能叠多高。
解题思路:1个砖块的长宽高(3个数)进行排列能有6种情况,每种情况都是要么就用要么不用。这就相当与是01背包的情况。
代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int max(int x,int y) 5 { 6 if(x>y) 7 return x; 8 else return y; 9 } 10 struct zt 11 { 12 int a,b,c; 13 bool operator <(const zt s) const 14 { 15 return a<s.a||a==s.a&&b<s.b; 16 } 17 }t[130]; 18 int d[130]; 19 int main() 20 { 21 int a[3],n,q,i,j,max1,o; 22 int maxn; 23 o=0; 24 while(cin>>n&&n) 25 { 26 q=0; 27 for(i=0;i<n;i++) 28 { 29 cin>>a[0]>>a[1]>>a[2]; 30 sort(a,a+3); 31 t[q].a=a[0]; 32 t[q].b=a[1]; 33 t[q].c=a[2]; 34 q++; 35 t[q].a=a[1]; 36 t[q].b=a[0]; 37 t[q].c=a[2]; 38 q++; 39 t[q].a=a[0]; 40 t[q].b=a[2]; 41 t[q].c=a[1]; 42 q++; 43 t[q].a=a[1]; 44 t[q].b=a[2]; 45 t[q].c=a[0]; 46 q++; 47 } 48 sort(t,t+q); 49 for(i=0;i<q;i++) 50 d[i]=t[i].c; 51 maxn=0; 52 for(i=0;i<q;i++) 53 { 54 max1=0; 55 for(j=i-1;j>=0;j--) 56 { 57 if(t[i].a>t[j].a&&t[i].b>t[j].b) 58 { 59 if(d[j]>max1) 60 max1=d[j]; 61 } 62 } 63 d[i]+=max1; 64 maxn=max(maxn,d[i]); 65 } 66 cout<<"Case "<<++o<<": "<<"maximum height = "<<maxn<<endl; 67 } 68 return 0; 69 }