hdu 5135 Little Zu Chongzhi's Triangles

http://acm.hdu.edu.cn/showproblem.php?pid=5135

题意:给你N个木棍的长度,然后让你组成三角形,问你组成的三角形的和最大是多少?

思路:先求出可以组成的所有的三角形,然后状压dp就可以。求所有的三角形也可以用状压,也可以三重循环求。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 #define maxn 1<<13
 6 using namespace std;
 7 
 8 
 9 int n;
10 int a[20];
11 int b[20];
12 int cc[maxn];
13 double ss[maxn];
14 double ans;
15 double dp[maxn];
16 
17 bool vis[20];
18 
19 
20 int main()
21 {
22     while(scanf("%d",&n)!=EOF)
23     {
24         if(n==0) break;
25         memset(cc,0,sizeof(cc));
26         memset(dp,0,sizeof(dp));
27         memset(ss,0,sizeof(ss));
28         for(int i=0; i<n; i++)
29         {
30             scanf("%d",&a[i]);
31         }
32         int t1=0;
33         for(int i=0; i<(1<<n); i++)
34         {
35             memset(b,0,sizeof(b));
36             int cnt=0;
37             for(int j=0; j<n; j++)
38             {
39                 if((1<<j)&i) cnt++;
40             }
41             if(cnt==3)
42             {
43                 int c=0;
44                 for(int j=0; j<n; j++)
45                 {
46                     if((1<<j)&i)
47                     {
48                         b[c++]=a[j];
49                     }
50                 }
51                 if((b[0]<b[1]+b[2])&&(b[1]<b[0]+b[2])&&(b[2]<b[0]+b[1]))
52                 {
53                     cc[t1]=i;
54                     double p=(double)((b[0]+b[1]+b[2])*1.0/2);
55                     double s=sqrt(p*(p-b[0]*1.0)*(p-b[1]*1.0)*(p-b[2]*1.0));
56                     ss[t1++]=s;
57                 }
58             }
59         }
60         double ans=0;
61         for(int i=0; i<(1<<n); i++)
62         {
63             for(int j=0; j<t1; j++)
64             {
65                 if((i&(cc[j]))==0)
66                 {
67                     dp[i|cc[j]]=max(dp[i|cc[j]],dp[i]+ss[j]);
68                     ans=max(ans,dp[i|cc[j]]);
69                 }
70             }
71         }
72         printf("%.2lf\n",ans);
73     }
74     return 0;
75 }
View Code

 

posted @ 2015-01-16 08:51  null1019  阅读(196)  评论(0编辑  收藏  举报