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 }

hdu 5135 Little Zu Chongzhi's Triangles

时间: 2024-10-05 12:50:20

hdu 5135 Little Zu Chongzhi's Triangles的相关文章

HDU 5135 Little Zu Chongzhi&#39;s Triangles(简单水题)

题目链接: 戳我 题目大意: 给一堆 木棍,用这些木棍组成三角形,要组成的所有的三角形的面积和最大,不一定要用完所有的木棍. 样例解释: 3 //三个棍子 1 1 20   // 每个棍子的长度,自然,这三个棍子不可能组成三角形,故输出 0.00 7          // 7个棍子 3 4 5 3 4 5 90 // 组成两个三角形(3, 3 4)和(4, 4, 5),面积和即为13.64 0   // 输出 0 退出 解题思路: 本来不想写题解的,因为太水了,,,,,,, 可是看到 谷歌搜出

[HDU 5135] Little Zu Chongzhi&#39;s Triangles (dfs暴搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意:给你n条边,选出若干条边,组成若干个三角形,使得面积和最大.输出最大的面积和. 先将边从小到大排序,这样前面的两条边加起来如果不大于第三条边就可以跳出,这是一个存在性条件. dfs(int idx,int now,int cnt,int nowmax)代表我当前处理的是第idx条边,已经加入边集的有cnt条边,当前的边的长度和为now,组成的最大面积和为nowmax. 暴力枚举每个三

hdu 5135 Little Zu Chongzhi&#39;s Triangles 状压DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 从大到小贪心是不对的! 比如 4 30 40 50 89 这组数据 结果应该是600 如果取后三条边只会是一个细长细长的三角形根本没多大面积 只不过因为数据水然后贪心碰巧能过而已 看到网上题解很多人用贪心我好郁闷... 状压DP 看到边的数目很少就应该想到这个了 先枚举可能出现的所有三角形 记录他们使用了那些边还有他们的面积 然后再枚举状态之中 套一层遍历所有三角形的循环 如果当前状态和三角形

HDU 5135 Little Zu Chongzhi&#39;s Triangles (14广州 状压dp)

Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 474    Accepted Submission(s): 252 Problem Description Zu Chongzhi (429–500) was a prominent Chinese mathematici

HDU 5135 Little Zu Chongzhi&#39;s Triangles(状态压缩dp+Vector)

这道题是水题,当时直接贪心就过了. 多阶段决策,其实应该用dp,他人的代码使用Vector进行预处理. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; int n, a[12]; double dp[1<<12]; double cal(int a, int b, i

[ACM] HDU 5135 Little Zu Chongzhi&#39;s Triangles (一堆木棍组成三角形最大面积)

Little Zu Chongzhi's Triangles Problem Description Zu Chongzhi (429–500) was a prominent Chinese mathematician and astronomer during the Liu Song and Southern Qi Dynasties. Zu calculated the value ofπ to the precision of six decimal places and for a

HDU 5135 Little Zu Chongzhi&#39;s Triangles(状压dp或者贪心)

题目大意:给你n个线段让你任意组成三角形,求组出来的三角形的面积的和最大为多少. 解题思路:首先你得知道海伦公式:S = sqrt(p*(p-a)*(p-b)*(p-c)), p = (a+b+c)/2. 思路一:贪心,按照边的长度进行排序,从大到小判断如果可以构成三角形,就让他构成三角形,这样组成的三角形的面积和一定是最大的. 思路二:状压dp,先暴力求出来所有可以组成的三角形对应的状态和面积,然后dp求解,状态转移公式是:dp[i|(f[j].xnum)] = max(dp[i|(f[j].

HDU 5135 Little Zu Chongzhi&#39;s Triangles(贪心)

Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 304    Accepted Submission(s): 180 Problem Description Zu Chongzhi (429–500) was a prominent Chinese mathematici

HDU 5131 Little Zu Chongzhi&#39;s Triangles (状压DP +2014广州现场赛)

题目链接:HDU 5131 Little Zu Chongzhi's Triangles 题意:给出一些线段,在其中选出3根组成三角形,问用这些线段组成的所有三角形的最大面积是多少. 7 3 4 5 3 4 5 90 两个三角形是(3,3,4),(5,5,4). 思路:N最大12,状态压缩,把所有可能组成的三角形存起来.A&B==0则说明A|B状态是有效的. 贪心也能过..为什么? AC代码: #include <stdio.h> #include <string.h> #