题目描述
和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。
请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。 输入输出格式 输入格式:
第1行:一个整数N
第2..N+1行:每行包含一个整数,即是木板长度。
输出格式:
仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。
用dfs(i,x,y,z)表示用完了长度小于等于i的木条,三边长度分别为x,y,z。保存每个长度的木条有几根,再规定x>=y>=z,再加上判重,速度就很快了。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[45],n,mx;
bool vis[45][1600][800];
double ans=-1;
double S(int x,int y,int z)
{
if (x>y+z||y>x+z||z>x+y) return -1;
double p=(double)(x+y+z)/2;
return sqrt(p*(p-x)*(p-y)*(p-z));
}
void dfs(int p,int x,int y,int z)
{
int i,j;
if (p>mx)
{
ans=max(ans,S(x,y,z));
return;
}
if (x<y) swap(x,y);
if (x<z) swap(x,z);
if (y<z) swap(y,z);
if (vis[p][x][y]) return;
vis[p][x][y]=1;
for (i=0;i<=a[p];i++)
for (j=0;i+j<=a[p];j++)
dfs(p+1,x+i*p,y+j*p,z+(a[p]-i-j)*p);
}
int main()
{
int i,j,k,p,q,x,y,z;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&x);
mx=max(x,mx);
a[x]++;
}
dfs(1,0,0,0);
if (ans<0) printf("-1\n");
else printf("%d\n",(int)(ans*100));
}