首页 > 代码库 > hdu 5135 Little Zu Chongzhi's Triangles
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。