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

 

你可能感兴趣的:(HDU)