poj 1948 Triangular Pastures(二维0/1背包)

简介: 点击打开链接poj 1948 思路: 二维0/1背包 分析: 1 题目要求从n个木棒里面选出m个组成一个三角形,使得三角形的面积最大 2 对于三角形来说知道了两条边和周长就可以求面积,按照0/1背包的思想dp[i][j][k]表示前i个木棒能否组成第一条边为长度j,第二条长度为k。

点击打开链接poj 1948

思路: 二维0/1背包
分析:
1 题目要求从n个木棒里面选出m个组成一个三角形,使得三角形的面积最大
2 对于三角形来说知道了两条边和周长就可以求面积,按照0/1背包的思想dp[i][j][k]表示前i个木棒能否组成第一条边为长度j,第二条长度为k。如果dp[j-v[i]][k] 或dp[j][k-v[i]] 为true则dp[j][k]就为true
3 我们求出了所有可能的组合之和,就去枚举所有的边长的情况,然后求最大的面积

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 45;
const int MAXN = 2010;
int n , sum , v[N];
bool dp[MAXN][MAXN];

int solve(){
    memset(dp , false , sizeof(dp));
    dp[0][0] = 1;
    for(int i = 1 ; i <= n ; i++){
        for(int j = sum/2 ; j >= 0 ; j--){  // 最大的边长为周长的一半 
            for(int k = j ; k >= 0 ; k--){// 两条边存在大小的关系,所以直接让k <= j 即可
                if(j >= v[i] && dp[j-v[i]][k])
                    dp[j][k] = true;
                if(k >= v[i] && dp[j][k-v[i]])
                    dp[j][k] = true;
            }
        }
    }
    int ans;
    ans = -1;
    for(int j = 1 ; j <= sum/2 ; j++){
        for(int k = 1 ; k <= j ; k++){// 由于上面是j >= k,这里k枚举到j
            int t = sum-j-k;
            if(dp[j][k] && t > 0 && j+k > t && j+t > k && t+k > j){
               // 注意由于求最大的面积,这边求p注意,求tmp的时候才转化为int
               double p=(t+j+k)/2.0;  
               int tmp=(int)(sqrt(p*(p-t)*(p-j)*(p-k))*100);
               ans = max(ans , tmp); 
            }
        } 
    }
    return ans;
}

int main(){
    while(scanf("%d" , &n) != EOF){
        sum = 0;
        for(int i = 1 ; i <= n ; i++){
           scanf("%d" , &v[i]); 
           sum += v[i];
        }
        printf("%d\n" , solve()); 
    }
    return 0;
}



目录
相关文章
|
JavaScript 数据安全/隐私保护 UED
UniApp 中的路由魔法:玩转页面导航与跳转
UniApp 中的路由魔法:玩转页面导航与跳转
1982 3
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
285 0
|
人工智能 算法 Java
AI:互联网程序设计竞赛之蓝桥杯大赛的简介、奖项设置、大赛内容以及蓝桥杯与ACM(ICPC)的四个维度对比之详细攻略
AI:互联网程序设计竞赛之蓝桥杯大赛的简介、奖项设置、大赛内容以及蓝桥杯与ACM(ICPC)的四个维度对比之详细攻略
AI:互联网程序设计竞赛之蓝桥杯大赛的简介、奖项设置、大赛内容以及蓝桥杯与ACM(ICPC)的四个维度对比之详细攻略
|
9月前
|
存储 人工智能 JSON
AscendC从入门到精通系列(三)基于自定义算子工程开发AscendC算子
本文介绍了基于Ascend C的自定义算子开发流程,涵盖从工程创建、代码编写、编译部署到运行验证的全过程。以动态shape的AddCustom算子为例,详细描述了如何利用CANN提供的工具msOpGen生成开发工程,实现算子核函数与host侧代码,以及如何编译、部署和测试自定义算子。
|
10月前
|
机器学习/深度学习 自然语言处理 语音技术
探索深度学习中的Transformer模型及其在自然语言处理中的应用
探索深度学习中的Transformer模型及其在自然语言处理中的应用
424 5
|
存储 人工智能 BI
【头歌·计组·自己动手画CPU】二、运算器设计(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】二、运算器设计(理论版) 【计算机硬件系统设计】
1445 1
|
存储 前端开发 数据处理
|
缓存 分布式计算 资源调度
MapReduce入门(一篇就够了)
MapReduce入门(一篇就够了)
8848 0
MapReduce入门(一篇就够了)
|
存储 Linux Windows
操作系统中的内存管理:从原理到实践
内存管理是操作系统中的核心功能,它直接影响着系统的性能和稳定性。本文将深入探讨内存管理的基本原理、关键技术以及实际应用,帮助读者更好地理解内存管理在操作系统中的重要性。
|
机器学习/深度学习 人工智能 算法
秒懂算法 | 莫队算法
本篇介绍了莫队算法的几何意义、基本莫队、带修改莫队以及树上莫队的相关内容。
834 1
秒懂算法 | 莫队算法