poj 1948 Triangular Pastures

来源:互联网 发布:剑三捏脸数据不合法 编辑:程序博客网 时间:2024/05/21 09:47

题意:

给你n个木块,问你把所有木块用上构造一个三角形最大是多少

分析:

n<=40,len[i]<=40 那么我可以知道边最大不超过40*40/2

那么我们暴力枚举2个边就可以

写的有点丑g++超时,c++AC

ACcode:

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#define maxn 2006#define inf 0x3f3f3f3f#include <cstring>#define ll long longusing namespace std;int a[maxn];int dp[maxn][maxn];double fun(double a,double b,double c){    double p=(a+b+c)/2;    return sqrt(p*(p-a)*(p-b)*(p-c));}int main(){    int n;    while(scanf("%d",&n)!=EOF){        int sum=0;        for(int i=1;i<=n;++i)scanf("%d",&a[i]),sum+=a[i];        memset(dp,0,sizeof(dp));        dp[0][0]=1;        double ans=0;        for(int i=1;i<=n;i++)            for(int j=sum/2;j>=0;j--)                for(int k=sum/2;k>=0;k--){                    if(j-a[i]>=0&&dp[j-a[i]][k]){                        dp[j][k]=1;                        ans=max(ans,fun(j,k,sum-j-k));                    }                    else if(k-a[i]>=0&&dp[j][k-a[i]]){                        dp[j][k]=1;                        ans=max(ans,fun(j,k,sum-j-k));                    }                }        printf("%d\n",ans==0?-1:(int)(ans*100));    }    return 0;}


0 0