【题意】中文题,直接给 题目链接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;
}