POJ 1948 Triangular Pastures【二维01背包】

题意:给出n条边,用这n条边构成一个三角形,求三角形的最大面积。

先求面积,用海伦公式,s=sqrt(p*(p-a)*(p-b)*(p-c)),其中a,b,c分别为三角形的三条边,p为三角形的半周长,同时由这个根式可以推出,三角形的任意一条边小于其半周长(根号里面大于0,如果等于0面积为0没有意义了)

所以考虑背包两条边,再用周长减去这两条边求出第三条边,再遍历一遍找出最大的三角形。

dp[i][j]表示三角形的第一条边为i,第二条边为j所构成的三角形是否存在,

如果存在,dp[i][j]=1,否则为0 当dp[i][j]=1的时候,dp[i+l[k]][j]和dp[i][j+l[k]]也为1

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm>  
 5 #include<math.h>
 6 using namespace std;
 7 
 8 int dp[1005][1005],l[1005];
 9 
10 int  area(int a,int b,int c)
11 {
12     double p=(a+b+c)*0.5;
13     return int (sqrt(p*(p-a)*(p-b)*(p-c))*100);
14 }
15 
16 int main()
17 {
18     int n,i,j,k,c;
19     while(scanf("%d",&n)!=EOF)
20     {
21         int sum=0, ans=-1;    
22         for(i=1;i<=n;i++) {scanf("%d",&l[i]);sum+=l[i];}
23         memset(dp,0,sizeof(dp));
24         dp[0][0]=1;
25         c=sum;
26         sum=c/2-(c/2==0);
27         
28         for(k=1;k<=n;k++)
29             for(i=sum;i>=0;i--)
30                 for(j=i;j>=0;j--)
31                     if(dp[i][j]) dp[i][j+l[k]]=dp[i+l[k]][j]=1;
32     
33         for(i=sum;i>=1;i--)
34             for(j=i;j>=1;j--)
35                 if(dp[i][j]) ans=max(ans,area(i,j,c-i-j));
36         printf("%d\n",ans);
37     }
38     return 0;
39 }
View Code

 

 

还是看的题解= =,感觉这题的dp[][]数组的含义和那一题划分的有点像= = go--go

 

posted @ 2015-02-28 10:06  sequenceaa  阅读(245)  评论(0编辑  收藏  举报