题目描述

每 年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为“bg”。参加不同团体的bg会有不同的感觉,我们可以用一个非负整数为每个 bg定义一个“快乐度”。现给定一个bg列表,上面列出每个bg的快乐度、持续长度、bg发起人的离校时间,请你安排一系列bg的时间使得自己可以获得最 大的快乐度。

例如有4场bg:
第1场快乐度为5,持续1小时,发起人必须在1小时后离开;
第2场快乐度为10,持续2小时,发起人必须在3小时后离开;
第3场快乐度为6,持续1小时,发起人必须在2小时后离开;
第4场快乐度为3,持续1小时,发起人必须在1小时后离开。
则获得最大快乐度的安排应该是:先开始第3场,获得快乐度6,在第1小时结束,发起人也来得及离开;再开始第2场,获得快乐度10,在第3小时结束,发起人正好来得及离开。此时已经无法再安排其他的bg,因为发起人都已经离开了学校。因此获得的最大快乐度为16。

注意bg必须在发起人离开前结束,你不可以中途离开一场bg,也不可以中途加入一场bg。
又因为你的人缘太好,可能有多达30个团体bg你,所以你需要写个程序来解决这个时间安排的问题。

输入

测试输入包含若干测试用例。每个测试用例的第1行包含一个整数N (<=30),随后有N行,每行给出一场bg的信息:h l t
其中 h 是快乐度,l是持续时间(小时),t是发起人离校时间。数据保证l不大于t,因为若发起人必须在t小时后离开,bg必须在主人离开前结束。

当N为负数时输入结束。

输出

每个测试用例的输出占一行,输出最大快乐度。

样例输入

3
6 3 3
3 2 2
4 1 3
4
5 1 1
10 2 3
6 1 2
3 1 1
-1

样例输出

7
16

把bg看作是物品,快乐度看作是物品价值,持续时间看作是物品重量,所有人最迟离开时间看作是背包容量

dp[ i ][ v ] 表示:考虑前 i 场bg恰好在时间 v 结束时,能获得的最大快乐度 (只是考虑前 i 场,并不一定前 i 场bg都参与)

先对bg发起人的离开时间从早到晚排序好,再用01背包计算快乐度

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include <string>
#include <queue>
#include <cstring>
#include <vector>
#include <set>
using namespace std;
#define maxn 10000
struct BG {int h, l, t;
}bg[maxn];
int dp[maxn];bool cmp(BG &x, BG &y) {return x.t < y.t;
}
int main() {int n, C;while (cin >> n && n>=0) {C = -1;//记录最晚离开的时间for (int i = 1; i <= n; i++) {cin >> bg[i].h >> bg[i].l >> bg[i].t;if (bg[i].t > C)C = bg[i].t;}sort(bg + 1, bg + n + 1, cmp);//按离开时间排序fill(dp, dp + maxn, 0);for (int i = 1; i <= n; i++) {for (int v = bg[i].t; v >= bg[i].l; v--) {dp[v] = max(dp[v], dp[v - bg[i].l] + bg[i].h);}}int MAX = 0;for (int i = 1; i <= C; i++)MAX = max(MAX, dp[i]);cout << MAX << endl;}
}

毕业BG(01背包问题)相关推荐

  1. HDU1881 毕业bg【0-1背包】

    毕业bg Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  2. ACM1881 01背包问题应用

    01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: 1 # ...

  3. 杭电毕业bg dfs

    思路:这个就是01背包问题差不多.先按持续时间排序.在dfs 这样想 第一场排队 要还是不要,第二场要还是不要,一直到最后一场求出最优解. 毕业bg Problem Description 每年毕业的 ...

  4. hdu 1881 毕业bg

    毕业bg                                                                                Time Limit: 2000 ...

  5. c语言-01背包问题

    01背包问题 问题:有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 分析: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选 ...

  6. 三十四、动态规划解决01背包问题

    一.动态规划算法介绍 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获取最优解的处理算法. 动态规划算法与分治算法类似,其基本思想是将待求解的问题分解成若干个子问题,先求子问题, ...

  7. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  8. poj3624 Charm Bracelet DP 01背包问题

    题目链接:http://poj.org/problem?id=3624 01背包问题,接触DP的第一题. 1 ///2014.4.10 2 ///poj3624 3 4 #include <io ...

  9. 【基础算法复习】01背包问题(一)

    一.绪论 01背包问题是一个经典的动态规划问题,问题描述为"有n个物品,其价值分别为v[n],要求将其装在承重为m的背包,每个物品只能装一次的情况下,在不超过承重的范围下价值最大" ...

  10. C++~回溯+贪心法解决01背包问题

    C++~回溯+贪心法解决01背包问题 参考文章: (1)C++~回溯+贪心法解决01背包问题 (2)https://www.cnblogs.com/rimochiko/p/8168638.html 备 ...

最新文章

  1. AlphaGo之后,DeepMind重磅推出AlphaFold:基因序列预测蛋白质结构
  2. 机器学习和统计中的AUC
  3. idea集成spring+spring MVC+mybatis问题
  4. 多项式乘法c语言,急!!!!c语言:求n次多项式的加法和乘法
  5. OSPF多区域配置与汇总
  6. different way to retrieve SAP UI5 manifest
  7. php 枚举类型比较,枚举的比较-python编程入门系列图文教程-PHP中文网教程
  8. 大数据驱动乡村振兴共享共治机制研究
  9. 各国网络安全审查制度及案例分析
  10. 矩阵乘法c语言蓝桥杯,[蓝桥杯][基础练习VIP]矩阵乘法 (C语言代码)
  11. 使用bcryptjs对密码加密时,其校验原理是怎样的?
  12. PHP代码更新后画面不更新,为什么我的PHP代码不能更新SQL
  13. 【python写一个无限弹窗】
  14. Git 可视化工具 Fork 使用指南
  15. 使用SmartUpload上传文件报错
  16. NBA比赛数据table表格
  17. 基于英雄联盟寻路背景的A星算法及python实现
  18. 华盛顿大学计算机硕士什么时候录取,2020年华盛顿大学排名TFE Times美国最佳计算机科学硕士专业排名第5...
  19. 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
  20. 成考计算机专业难不难,成人高考计算机类难度大吗(成人大学难度)

热门文章

  1. 一个小小的AI训练营竟然卧虎藏龙
  2. Java 8 开发的 4 大技巧
  3. 深入微服务 API 网关之架构实践篇
  4. 看看人家 SpringBoot 的全局异常处理,多么优雅...
  5. 一个支付案例,学会策略模式!
  6. 你还在认为 count(1) 比 count(*) 效率高?
  7. Spring Boot + Vue + Shiro 实现前后端分离、权限控制
  8. 提分策略:数据采样方法最全总结!
  9. 零基础入门CV赛事,理论结合实践
  10. 谈谈你对集成学习的见解与认识,描述一下它们的优势所在?