Antes de hacer este problema primero debe entender la fórmula del área del triángulo: fórmula Helen .
Aquí conclusiones en escribir una escritura, es decir, por tres lados arbitrarias del triángulo \ (A, B, C \) , por lo que \ (X = \ tfrac {. 1} {2} (A + B + C) \) , entonces no es \ (S = \ sqrt {X (XA) (XB) (XC)} \) .
Siguiente consideramos el estado set, así que \ (f [k] [a ] [b] [c] \) representa la antigua \ (K \) º madera si rodeada tres lados de longitud \ (a, b, c \) triángulo. Sin embargo, la longitud del lado puede ser de hasta \ (800 \) , el tiempo y la complejidad del espacio \ (800 ^ 3 \ times 40 \) , que claramente no es factible.
Así que tratar de optimizar, se observa que el perímetro del triángulo es constante, entonces determinar las dos partes puedan encontrar el tercer lado. Set \ (C \) es el perímetro triangular, hacemos el \ (f [k] [a ] [b] \) representa la antigua \ (K \) º madera si rodeada tres lados de longitud \ (A, b, Cab \) triángulo.
Dirección de Transferencia de tres casos:
-
La sección \ (K \) º madera en \ (I \) Este lados:
Entonces antes de su uso \ (k-1 \) º abordó los lados en longitud \ (ia [k] \) y \ (J \) triángulo, es decir, \ (f [k-1] [ia [k]] [j] \)
-
La sección \ (K \) º madera en \ (J \) Este lados: \ (F [. 1-K] [I] [JA [K]] \)
-
La sección \ (K \) º madera en el tercer lado: \ (F [. 1-K] [i] [j] \)
Hay ecuación de transferencia:
En este punto seguimos a optimizar el espacio, fácil de encontrar y sólo cuando la transferencia \ (f [-1 k] [] [] \) relacionado, por lo que deshacerse de la unidimensional considerar la actualización del valor actual de la matriz con los datos originales \ (f [ I] [J] \) .
Cabe señalar que \ (i, j \) debe caer ciclo, porque queremos garantizar que \ (f [i] [ja [k]] \) y \ (f [ja [k] ] [i] \) valores son en el suelo, y \ (01 \) mochila similar.
Por último, para \ (f [i] [j ] = 1 \) un \ (I, J \) , se determinó \ ((i, j, Cij ) \) si el triángulo composición. Si se utiliza la composición para calcular la respuesta a la zona de Helen fórmula de actualización.
\ (\ Operatorname {Código:} \)
#include<bits/stdc++.h>
using namespace std;
const int N=45;
int n,sum,ans=-1,a[N],f[805][805];
bool check(int x,int y,int z) {
if(x && y && z && x+y>z && y+z>x && x+z>y) return true;
return false;
}
int hailen(double x,double y,double z) {
double s=(x+y+z)/2;
return sqrt(s*(s-x)*(s-y)*(s-z))*100;
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum=sum+a[i];
f[0][0]=1;
for(int k=1;k<=n;k++) {
for(int i=(sum>>1);i>=0;i--) {
for(int j=(sum>>1);j>=0;j--) {
if(i-a[k]>=0 && f[i-a[k]][j]) f[i][j]=1;
if(j-a[k]>=0 && f[i][j-a[k]]) f[i][j]=1;
}
}
}
for(int i=0;i<=(sum>>1);i++) {
for(int j=0;j<=(sum>>1);j++) {
if(f[i][j] && check(i,j,sum-i-j)) ans=max(ans,hailen(i,j,sum-i-j));
}
}
printf("%d\n",ans);
return 0;
}