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 

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 }
View Code

 

posted on 2015-08-16 19:09  最爱剪刀手  阅读(166)  评论(0编辑  收藏  举报