POJ 1948 Triangular Pastures 二维 0-1背包

题意:给了n个边,要求每条都用上,组成一个三角形,求三角形面积最大值的100倍(取整数);

分析:我们可以开个二维数组dp[i][j]来记录三角形的两条边的长度i,j,那么另一条边就是总长度减去i和j。

疑问:判定能构成三角形的条件,设p为三角形的半周长,a+b>c 两边同时加上c 则 2*p >2*c 即 p>c,同理p>a,p>b。

由海伦公式S=sqrt(p*(p-a)*(p-b)*(p*c))也可以得出这结论 。

View Code
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
bool dp[802][802];
int a[42];
double cal(int a, int b, int c,double p)//海伦公式
{
    if(a>=p||b>=p||c>=p)return -1.0;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
int main()
{
    int n, i, j, k, sum, s;
    while(~scanf("%d",&n))
    {
        sum = 0;
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]),sum+=a[i];
        s= sum/2;
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(i=1;i<=n;i++)
            for(j=s;j>=0;j--)
                for(k=s;k>=0;k--)
                    if(dp[j-a[i]][k]&&j>=a[i]||dp[j][k-a[i]]&&k>=a[i])dp[j][k]=1;
        double maxx=-2.0;
        for(i=1;i<=s;i++)
            for(j=1;j<=s;j++)
                if(dp[i][j])
                {
                    double val=cal(i,j,sum-i-j,sum*1.0/2);
                    if(maxx<val)maxx=val;
                }
        if(maxx==-1.0)printf("-1\n");
        else printf("%d\n",(int)(maxx*100));
    }
    return 0;
}

 

 

posted @ 2012-08-12 23:01  To be an ACMan  Views(214)  Comments(0)    收藏  举报