poj1948 二维背包

本文针对携程比赛中的一个具体问题——如何使用给定长度的木棒构成三角形,并找到最大面积的解决方案进行了详细解析。通过使用二维背包算法确定所有可能的边长组合,最终找出能够构成三角形的最大面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

携程的第二场第二题,比赛时被水过去了。。。

题目给一些木棒,要求全部用上形成三条边,问能形成的三角形最大面积是多少?

题意很明确,只需要确定所有能形成的边的组合,再从这些组合中求最大值即可。

用二维数组dp[i][t]表示边长分别为i和t,两边确定,第三条边边长为sum-i-t,然后就是背包确定能否形成i和t两条边的过程了。

很简单的二维背包,比赛时看出来是背包,没想到这点,以至于花了大把时间去水掉,还是做过的题目太少。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

int dp[801][801];
int a[41];
int n;
double sum;

bool sap(int a,int b,int c)
{
    if (a+b>c&&a+c>b&&b+c>a)
        return true;
    return false;
}

int s(int a,int b,int c)
{
    double ss=sum/2;
    ss=ss*(ss-a)*(ss-b)*(ss-c);
    ss=sqrt(ss)*100;
    int t=ss;
    return t;
}

int main()
{
    while (~scanf("%d",&n))
    {
        sum=0;
        for (int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for (int i=0;i<n;i++)
        {
            for (int t=sum/2;t>=0;t--)
            {
                for (int k=sum/2;k>=0;k--)
                {
                    if ((t>=a[i]&&dp[t-a[i]][k])||(k>=a[i]&&dp[t][k-a[i]]))
                        dp[t][k]=1;
                }
            }
        }
        int m=-1;
        for (int i=0;i<=sum/2;i++)
        {
            for (int t=0;t<=sum/2;t++)
            {
                if (dp[i][t]&&sap(i,t,sum-i-t))
                {
                    int cur=s(i,t,sum-i-t);
                    m=m>cur?m:cur;
                }
            }
        }
        printf("%d\n",m);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值