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;
}



目录
打赏
0
0
0
0
15
分享
相关文章
上三角矩阵(Upper Triangular Matrix
上三角矩阵(Upper Triangular Matrix)是一种特殊形式的矩阵,其非零元素仅位于主对角线以上。在数学和工程领域中,上三角矩阵通常用于线性代数和微积分等问题。以下是一些关于上三角矩阵的特点和应用:
1698 0
Light oj 1080 - Binary Simulation(树状数组区间更新点查询)
有一字符串只包含0和1,然后又m组操作,I L R是将从L到R的字符进行翻转操作0变为1、1变为0,Q x表示询问第x的字符。
50 0
组合数学 - 母函数的变形 --- hdu 1171:Big Event in HDU
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24002    Accepted Submissio...
1076 0
2023年美赛C题 预测Wordle结果Predicting Wordle Results这题太简单了吧
本文提供了2023年美赛C题"预测Wordle结果"的详细建模方案、Python代码实现、数据和图片,包括对Wordle游戏规则的理解、数据分析、模型构建和结果预测,以及如何撰写给《纽约时报》字谜编辑的信件。
101 1
2023年美赛C题 预测Wordle结果Predicting Wordle Results这题太简单了吧
|
10月前
|
Sentieon | 每周文献-Population Sequencing-第三十四期
Sentieon | 每周文献-Population Sequencing-第三十四期
63 0
|
10月前
|
Sentieon | 每周文献-Population Sequencing-第二十三期
Sentieon | 每周文献-Population Sequencing-第二十三期
48 1
|
10月前
|
Sentieon | 每周文献-Population Sequencing-第二十四期
Sentieon | 每周文献-Population Sequencing-第二十四期
57 1
UVa11157 - Dynamic Frog(动态规划)
UVa11157 - Dynamic Frog(动态规划)
83 0
light oj 1047 - Neighbor House 动态规划
动态规划,这个和刘汝佳算法竞赛入门经典P158的数字三角形有些相似,不过是求最小的值,而且有些限制,每次走到点和上次走的点不在同一列。
42 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等