和全部人同樣,奶牛喜歡變化。它們正在設想新造型的牧場。奶牛建築師Hei想建造圍有漂亮白色柵欄的三角形牧場。她擁有N(3≤N≤40)塊木板,每塊的長度Li(1≤Li≤40)都是整數,她想用全部的木板圍成一個三角形使得牧場面積最大。ios
請幫助Hei小姐構造這樣的牧場,並計算出這個最大牧場的面積。ide
輸入格式:spa
第1行:一個整數Ncode
第2..N+1行:每行包含一個整數,便是木板長度。blog
輸出格式:ip
僅一個整數:最大牧場面積乘以100而後舍尾的結果。若是沒法構建,輸出-1。ci
5 1 1 3 3 4
692
樣例解釋:692=舍尾後的(100×三角形面積),此三角形爲等邊三角形,邊長爲4。get
————————————————————我是分割線————————————————————————string
dp題目,用dp[i][j][k]表示前i塊木板是否能拼成j、k長度,便可。it
記得用海倫公式
1 /* 2 Problem: 3 OJ: 4 User: S.B.S. 5 Time: 6 Memory: 7 Length: 8 */ 9 10 #include<iostream> 11 #include<cstdio> 12 #include<cstring> 13 #include<cmath> 14 #include<algorithm> 15 #include<queue> 16 #include<cstdlib> 17 #include<iomanip> 18 #include<cassert> 19 #include<climits> 20 #include<functional> 21 #include<bitset> 22 #include<vector> 23 #include<list> 24 #define F(i,j,k) for(int i=j;i<=k;++i) 25 #define M(a,b) memset(a,b,sizeof(a)) 26 #define FF(i,j,k) for(int i=j;i>=k;i--) 27 #define maxn 10001 28 #define inf 0x3f3f3f3f 29 #define maxm 4001 30 #define mod 998244353 31 using namespace std; 32 int read(){ 33 int x=0,f=1;char ch=getchar(); 34 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 35 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 36 return x*f; 37 } 38 int n,m; 39 bool dp[2000][2000]; 40 int d[41]; 41 int sum=0; 42 double ans=-1.0; 43 inline double solve(int a,int b,int c) 44 { 45 if(c==0||a+b<=c||b+c<=a||a+c<=b) return -1; 46 double p=(a+b+c)/2.0; 47 return 100*sqrt(p*fabs(p-a)*fabs(p-b)*fabs(p-c)); 48 } 49 int main() 50 { 51 std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y; 52 ifdef LOCAL 53 54 freopen("pasture.in","r",stdin); 55 freopen("pasture.out","w",stdout); 56 #endif 57 cin>>n; 58 F(i,1,n) cin>>d[i],sum+=d[i]; 59 F(i,1,n) dp[0][0]=true; 60 F(k,1,n)FF(i,sum,0)FF(j,sum,0){ 61 if(i>=d[k]) dp[i][j]=dp[i][j]||dp[i-d[k]][j]; 62 if(j>=d[k]) dp[i][j]=dp[i][j]||dp[i][j-d[k]]; 63 if(k==n&&i&&j&&dp[i][j]) ans=max(ans,solve(i,j,sum-i-j)); 64 } 65 cout<<(int)(ans)<<endl; 66 return 0; 67 }