题目链接:poj 1948 Triangular Pastures
题目大意:给出若干个木棍的长度,要求用这些木棍组成一个三角形,求最大面积,不能组成输出-1.
解题思路:dp[i][j]表示长度为i和j的边是否能同时被组成,用01背包去计算出所有的可组成情况,另一条边就用s(和)-i-j;然后就是枚举i和j,维护最大值。
#include <stdio.h> #include <string.h> #include <math.h> const int N = 805; int n, s, dp[N][N]; void add (int l) { for (int i = 800; i >= 0; i--) { for (int j = 800; j >= 0; j--) { if (dp[i][j]) { if (i + l < N) dp[i+l][j] = 1; if (j + l < N) dp[i][j+l] = 1; } } } } void init () { s = 0; memset(dp, 0, sizeof(dp)); dp[0][0] = 1; int l; for (int i = 0; i < n; i++) { scanf("%d", &l); s += l; add(l); } } int area (double x, double y, double z) { double p = (x*x - y*y + z*z)/(2*z); double h = sqrt(x*x - p*p); return h*z/2 * 100; } void solve () { int ans = -1; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (dp[i][j] == 0) continue; int x = s - i - j; if (i + j <= x || i + x <= j || j + x <= i) continue; int tmp = area(i, j, x); if (tmp > ans) ans = tmp; } } printf("%d\n", ans); } int main () { while (scanf("%d", &n) == 1 && n) { init (); solve (); } return 0; }
poj 1948 Triangular Pastures(01背包+暴力),布布扣,bubuko.com
poj 1948 Triangular Pastures(01背包+暴力)
原文:http://blog.csdn.net/keshuai19940722/article/details/23480937