题目链接:题目
题目大意:给你N的数,求能组成所有三角行的面积和的最大值
解题思路:状态压缩dp,还没接触过dp,,,,感觉好难啊,,
我也不会写,说下思路把,就是枚举所有的状态,,其中三个一组,组成三角行,并且边不能重复用
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 20;
const int maxm = (1<<14);
int a[maxn];
double dp[maxm];
struct Node{
int choice;
double S;
}node[maxm];
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));
}
int main(){
int n;
while(~scanf("%d",&n)&&n){
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
int cnt=0;
for(int i=0;i<(1<<n);i++){
int tmp[maxn];
int loc = 0;
for(int j=0;j<n;j++){
if(i&(1<<j)){
tmp[loc++]=a[j];
}
}
if(loc != 3 || tmp[0] + tmp[1] <=tmp[2]) continue;
node[cnt].choice=i;
node[cnt].S=area(tmp[0],tmp[1],tmp[2]);
cnt++;
}
double ans=0;
for(int i=0;i< (1<<n);i++){
for(int j=0;j<cnt;j++){
if((i & node[j].choice)==0){
dp[i | node[j].choice] = max(dp[i|node[j].choice],dp[i]+node[j].S);
ans=max(ans,dp[i|node[j].choice]);
}
}
}
printf("%.2lf\n",ans);
}
return 0;
}