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.
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.
* 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
5
1
1
3
3
4
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; }