P1284 三角形牧场

原题链接

题解

1.看到数据范围很小,所以我们可以穷举
如何穷举呢?
三个方向的背包dp,令 dp[i][j][k] 来表示 三边长度为 i,j,k 时能否达到,然后最外面一维是所用的木板
由于她想用所有的木板 所以 k=totalij ,所以可以变成两维
注意这里的背包dp要倒着来,不然继承的状态是刚刚才刷新的状态

code

#include<bits/stdc++.h>
using namespace std;
int line[50];
int wh[1605][1605]={0};
#define db double
double area(db i,db j,db k)//方便计算
{
    double p=(i+j+k)/2;
    return sqrt(p*(p-i)*(p-j)*(p-k));
}
int main()
{
    ios::sync_with_stdio(false);
    int n,total=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>line[i];
        total+=line[i];
    }

    wh[0][0]=1;
    for(int k=1;k<=n;k++)
    {
        for(int i=total;i>=0;i--)
        {
            for(int j=total;j>=0;j--)//不管三角形的限制,直接算就完了
            {
                if(i>=line[k]) wh[i][j]|=wh[i-line[k]][j];
                if(j>=line[k]) wh[i][j]|=wh[i][j-line[k]];
            }
        }
    }

    double ans=0;
    int flag=0;
    for(int i=1;i<=total;i++)
    {
        for(int j=1;j<=total;j++)
        {
            int k=total-i-j;
            if(i+j>k&&k+j>i&&k+i>j&&wh[i][j])//在这里再考虑是否是三角形
            {
                ans=max(ans,area((db)i,(db)j,(db)k));
                flag=1;
            }
        }
    }

    if(!flag) puts("-1");
    else printf("%.0lf",floor(ans*100));
    return 0;
}

posted @   纯粹的  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示