题目描述
和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。
请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。
输入输出格式
输入格式:
第1行:一个整数N
第2..N+1行:每行包含一个整数,即是木板长度。
输出格式:
仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。
输入输出样例
输入样例#1:
5 1 1 3 3 4
输出样例#1:
692
说明
样例解释:692=舍尾后的(100×三角形面积),此三角形为等边三角形,边长为4。
类背包DP
f[i][j]表示第一条边长度为i,第二条边长度为j的情况能否组出。 sum-i-j可以算出第三边。如果三条边可以组成三角形,则计算面积。
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=100010; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 double ss(double a,double b,double c){ 17 double p=(a+b+c)/2; 18 return sqrt( p*(p-a)*(p-b)*(p-c) ); 19 } 20 bool pd(int a,int b,int c){ 21 if(a<b)swap(a,b); 22 if(a<c)swap(a,c); 23 if(a<=b+c)return 1; 24 return 0; 25 } 26 int n; 27 int a[50]; 28 int smm=0; 29 bool f[1610][1610]; 30 int main(){ 31 freopen("pasture.in","r",stdin); 32 freopen("pasture.out","w",stdout); 33 n=read(); 34 int k,i,j; 35 for(i=1;i<=n;i++) a[i]=read(),smm+=a[i]; 36 int tmp=smm/2; 37 f[0][0]=1; 38 double ans=0.0; 39 for(k=1;k<=n;k++){ 40 for(i=tmp;i>=0;--i) 41 for(j=tmp;j>=0;--j){ 42 if(i>=a[k])f[i][j]|=f[i-a[k]][j]; 43 if(j>=a[k])f[i][j]|=f[i][j-a[k]]; 44 if(f[i][j] && pd(i,j,smm-i-j)){ 45 ans=max(ans,ss(i,j,smm-i-j)*100); 46 } 47 } 48 } 49 if(ans==0)printf("-1 "); 50 else printf("%.0f ",floor(ans)); 51 return 0; 52 }