poj 1948 Triangular Pasture

来源:互联网 发布:json.stringify array 编辑:程序博客网 时间:2024/05/26 17:48

Description

Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectangular shapes are out of favor; new geometries are the favorite. 
I. M. Hei, the lead cow pasture architect, is in charge of creating a triangular pasture surrounded by nice white fence rails. She is supplied with N (3 <= N <= 40) fence segments (each of integer length Li (1 <= Li <= 40) and must arrange them into a triangular pasture with the largest grazing area. Ms. Hei must use all the rails to create three sides of non-zero length. 

Help Ms. Hei convince the rest of the herd that plenty of grazing land will be available.Calculate the largest area that may be enclosed with a supplied set of fence segments. 

Input

* Line 1: A single integer N 
* Lines 2..N+1: N lines, each with a single integer representing one fence segment's length. The lengths are not necessarily unique. 

Output

A single line with the integer that is the truncated integer representation of the largest possible enclosed area multiplied by 100. Output -1 if no triangle of positive area may be constructed. 

Sample Input

511334

Sample Output

692
二维dp模板题,三角形面积计算:p=(a+b+c)/2,s=sqrt(p*(p-a)*(p-b)*(p-c));
dp[i][j]=1表示长度为i和j的棒子可以构成三角形,第三边为s-i-j.每条边不超过总和s/2,棒子最多用一次,且必须用完。
#include<iostream>  #include<cmath>  #include<cstdio>  #include<cstring>  using namespace std;  int x[41], n, tot = 0, ans = -1, half;  bool dp[801][801];  int main()  {  int i,j,k;    scanf("%d", &n);      for(i = 1; i <= n; i++)      {          scanf("%d", &x[i]);          tot += x[i];      }      memset(dp, 0, sizeof(dp));      dp[0][0] = 1, half = tot >> 1;  for(i = 1; i <= n; i++)          for(j = half; j >= 0; j--)              for( k = j; k >= 0; k--)                  if (j >= x[i] && dp[j - x[i]][k] || k >= x[i] && dp[j][k - x[i]])                      dp[j][k] = 1;      for(i = half; i >= 1; i--)          for(j = i; j >= 1; j--)              if (dp[i][j])              {                  k = tot - i - j;                  if (i + j > k && i + k > j && j + k > i)                  {                      double p = (i + j + k) * 1.0 / 2;                      int temp = (int)(sqrt(p * (p - i) * (p - j) * (p - k)) * 100);                      if (temp > ans)                          ans = temp;                  }              }      cout << ans << endl;      return 0;  }  


0 0
原创粉丝点击