题意:给出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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ",ans); 37 } 38 return 0; 39 }
还是看的题解= =,感觉这题的dp[][]数组的含义和那一题划分的有点像= = go--go