题目意思是,有 n 个栅栏,每个栅栏的长度给出了,要求用这 n 个栅栏构成三角形,求面积最大的
开先没看懂题目意思,不知道 n 个栅栏全部要用上。思路就是把两条边枚举出来,第三条边就知道了,然后把能构成三角形的面积都算出来,取最大值。
代码:
#include <iostream> #include <cstring> #include <cmath> using namespace std; const int MAX = 1600; int n; int dp[MAX][MAX]; int v[MAX]; int getArea(int a, int b, int c); int main(){ // freopen("input.txt", "r", stdin); int maxn = 0; cin >> n; for(int i=1; i<=n; i++){ cin >> v[i]; maxn += v[i]; } //枚举出两条边的所有值 memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(int i=1; i<=n; i++){ for(int j=maxn; j>=0; j--){ for(int k=maxn; k>=0; k--){ if(dp[j][k]){ dp[j+v[i]][k] = 1; dp[j][k+v[i]] = 1; } } } } //求面积最大的 int ans = -1; for(int i=1; i<maxn; i++){ for(int j=1; j<maxn; j++){ if(dp[i][j]){ int k = maxn - i - j; if(i + j <= k || i + k <= j || j + k <= i) continue; ans = max(ans, getArea(i, j, k)); } } } cout << ans; return 0; } int getArea(int a, int b, int c){ double p = (a + b + c)*1.0 / 2; return sqrt(p*(p-a)*(p-b)*(p-c)) * 100; }