zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    37     }
    38     return 0;
    39 }
    View Code

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

  • 相关阅读:
    [转]看懂UML类图
    [转]客户需要什么样的业务解决方案
    [转]逻辑和计算机
    [转]数据库备份与恢复方案
    125个工具与技术(PMBOK2008)
    72个可交付成果(PMBOK2008)
    47个过程(PMBOK2008)
    项目管理详细任务(PMBOK2008)
    项目管理过程组和知识领域表(PMBOK2008)
    项 目 管 理 知 识 体 系 指 南 (PMBOK2008)
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4304797.html
Copyright © 2011-2022 走看看