题意:给你n个木棒,然后用这些构成三角形,求最大的面积
状压一下
#include<bits/stdc++.h> using namespace std; double area(int a,int b,int c){ double p=(a+b+c)*1.0/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } double dp[1<<(13)]; int p[20],n; bool vit[13]; bool judge(int a,int b,int c){ if(a+b>c&&a+c>b&&b+c>a) return 1; return 0; } int main(){ while(scanf("%d",&n)&&n){ for(int i=0;i<n;i++) scanf("%d",&p[i]); double ans=0,mmax=0; sort(p,p+n); memset(dp,0,sizeof(dp)); int len=1<<n; for(int i=1;i<=len;i++){ int tp=i,id=0; vector<int>tmp;tmp.clear(); while(tp){ if(tp&1) tmp.push_back(id); tp/=2; id++; } if(tmp.size()<3) continue; for(int ii=0;ii<tmp.size();ii++) for(int j=ii+1;j<tmp.size();j++) for(int k=j+1;k<tmp.size();k++){ int a=tmp[ii],b=tmp[j],c=tmp[k]; if(!judge(p[a],p[b],p[c])) continue; int tt=i-(1<<a)-(1<<b)-(1<<c); dp[i]=max(dp[i],dp[tt]+area(p[a],p[b],p[c])); mmax=max(mmax,dp[i]); } } printf("%.2f\n",mmax); } }