HDU1881 - 毕业bg(背包大小会改变的01背包)

本文探讨了一种特殊的01背包问题,其中背包大小随时间变化,通过贪心策略实现最优解。介绍了问题的定义、算法思路及AC代码,适合对动态背包问题感兴趣的读者。

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

【题意】中文题,直接给 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1881

【分析】其实是一个背包大小会改变的01背包题,把欢乐度看成价值,持续时间看成重量,发起人离开时间看成背包大小(其实就是这个物品的影响的时间范围,以下简称范围,比较容易理解);因为题目要求bg必须在发起人离开前结束,也就是说选择范围大的物品时必须先选择范围小的物品,这样才可能能获得最大的价值,这里是贪心思想,所以要对物品按范围从小到大排序,保证先选择范围小的再选择范围大的。对于最后答案不能直接输出dp[maxt],因为背包大小不固定,所以要取0~maxt中的最大值。

【AC代码】0ms

#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 31
struct NODE{
    int h, l, t;
}p[MAXN];

bool cmp(NODE a, NODE b){return a.t<b.t;}
int main ()
{
    #ifdef SHY
    freopen("e:\\1.txt", "r", stdin);
    #endif
    int n;
    while(~scanf ("%d%*c", &n) && n > 0)
    {
        int dp[210] = {0};
        for (int i = 0; i < n; i++)
            scanf ("%d %d %d%*c", &p[i].h, &p[i].l, &p[i].t);
        sort(p,p+n,cmp);
        for (int i = 0; i < n; i++)
        {
            for (int j = p[i].t; j >= p[i].l; j--)
                dp[j] = max(dp[j], dp[j-p[i].l]+p[i].h);
        }
        int ans = dp[0];
        for (int i = 1; i <= p[n-1].t; i++)
        {
            if (ans < dp[i])
                ans = dp[i];
        }
        printf ("%d\n", ans);
    }
    return 0;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值