POJ 1948 TRIANGULAR PASTURES(背包问题)

来源:互联网 发布:淘宝模特小倩 编辑:程序博客网 时间:2024/05/21 09:56

原文:http://blog.acmj1991.com/?p=604

题意:给你n根火柴,让你用这些火柴拼凑出一个面积最大的三角形,求这个三角形的面积

思路:想了一阵子,因为一根火柴不能同时出现在同一个边中,所以开一个二维数组
dp[i][j]记录是否存在边长为i和j的三角形,为了不重复所以从后往前推

S=sqrt(x*(x-a)*(x-b)*(x-c)); (x=S/2)

#include<stdio.h>#include<math.h> #define maxN 1600bool dp[maxN][maxN];int max(int x,int y){return x>y?x:y;} int main(){    int len[45],n,sum=0;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&len[i]);        sum+=len[i];    }    dp[0][0]=1;    for(int i=0;i<n;i++)        for(int j=sum/2;j>=0;j--)            for(int k=sum/2;k>=0;k--)                if(j>=len[i]&&dp[j-len[i]][k]||k>=len[i]&&dp[j][k-len[i]])                    dp[j][k]=1;    int maxx=-1;    for(int i=1;i<sum/2;i++)        for(int j=1;j<sum/2;j++)            if(dp[i][j])            {                int k=sum-i-j;                if(!(i+j>k&&i+k>j&&k+j>i))continue;                double m=(i+j+k+0.0000001)/2.0;                int s=100*sqrt(double(m*(m-i)*(m-j)*(m-k)));                maxx=max(maxx,s);            }    printf("%d\n",maxx);}


原创粉丝点击