zoukankan      html  css  js  c++  java
  • Triangular Pastures (二维01背包)

    描述
    Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectangular shapes are out of favor; new geometries are the favorite.

    I. M. Hei, the lead cow pasture architect, is in charge of creating a triangular pasture surrounded by nice white fence rails. She is supplied with N (3 <= N <= 40) fence segments (each of integer length Li (1 <= Li <= 40) and must arrange them into a triangular pasture with the largest grazing area. Ms. Hei must use all the rails to create three sides of non-zero length.

    Help Ms. Hei convince the rest of the herd that plenty of grazing land will be available. Calculate the largest area that may be enclosed with a supplied set of fence segments.

    输入

    * Line 1: A single integer N

    * Lines 2..N+1: N lines, each with a single integer representing one fence segment's length. The lengths are not necessarily unique.

    输出

    A single line with the integer that is the truncated integer representation of the largest possible enclosed area multiplied by 100. Output -1 if no triangle of positive area may be constructed.

    样例输入


    5
    1
    1
    3
    3
    4

    样例输出


    692

    提示

    which is 100x the area of an equilateral triangle with side length 4

    题目大意:

    给定几条边,用上全部的边组成三角形,输出最大的三角形面积,若不存在,输出-1.
    大体思路:

    枚举所有可能出现的边的情况,在判断是否能成为三角形,然后进行处理

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1605;///40*40
    int dp[N][N]={0};///dp[i][j]代表能否构成i,j两边
    int a[50];
    int area(int a,int b,int c)
    {
        double p=(a+b+c)/2.0;
        return (int)100*sqrt(p*(p-a)*(p-b)*(p-c));
    }
    int main()
    {
        int n,sum=0;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i],sum+=a[i];
        dp[0][0]=1;
        for(int i=0;i<n;i++)
            for(int j=sum;j>=0;j--)
                for(int k=j;k>=0;k--)
                    if(j>=a[i]&&dp[j-a[i]][k]||k>=a[i]&&dp[j][k-a[i]])
                        dp[j][k]=1;
        int maxs=-1;
        for(int i=sum;i>0;i--)
            for(int j=i;j>0;j--)
            {
                if(dp[i][j])
                {
                    int k=sum-i-j;
                    if(i<j+k||i+j>k)///判断三边是否组成三角形
                        maxs=max(maxs,area(i,j,k));
                }
            }
        if(maxs==-1) cout<<"-1"<<'
    ';
        else cout<<maxs<<'
    ';
        return 0;
    }
  • 相关阅读:
    WINDOWS 远程桌面不能直接拷贝文件问题
    Spring的xml文件详解
    xml名称空间详解
    markdown基本语法
    web.xml文件详解
    Spring事务的7中传播行为
    docker修改容器配置文件
    Load balancer does not have available server for client: CLOUD-PROVIDER-HYSTRIX-PAYMENT
    layui导出表格的两种方法
    解决:Error:java: 无效的源发行版: 12
  • 原文地址:https://www.cnblogs.com/zdragon1104/p/8990133.html
Copyright © 2011-2022 走看看