毕业BG(01背包问题)
题目描述
每 年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为“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背包问题)相关推荐
- HDU1881 毕业bg【0-1背包】
毕业bg Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- ACM1881 01背包问题应用
01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: 1 # ...
- 杭电毕业bg dfs
思路:这个就是01背包问题差不多.先按持续时间排序.在dfs 这样想 第一场排队 要还是不要,第二场要还是不要,一直到最后一场求出最优解. 毕业bg Problem Description 每年毕业的 ...
- hdu 1881 毕业bg
毕业bg Time Limit: 2000 ...
- c语言-01背包问题
01背包问题 问题:有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 分析: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选 ...
- 三十四、动态规划解决01背包问题
一.动态规划算法介绍 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获取最优解的处理算法. 动态规划算法与分治算法类似,其基本思想是将待求解的问题分解成若干个子问题,先求子问题, ...
- python 回溯法 子集树模板 系列 —— 3、0-1背包问题
问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...
- poj3624 Charm Bracelet DP 01背包问题
题目链接:http://poj.org/problem?id=3624 01背包问题,接触DP的第一题. 1 ///2014.4.10 2 ///poj3624 3 4 #include <io ...
- 【基础算法复习】01背包问题(一)
一.绪论 01背包问题是一个经典的动态规划问题,问题描述为"有n个物品,其价值分别为v[n],要求将其装在承重为m的背包,每个物品只能装一次的情况下,在不超过承重的范围下价值最大" ...
- C++~回溯+贪心法解决01背包问题
C++~回溯+贪心法解决01背包问题 参考文章: (1)C++~回溯+贪心法解决01背包问题 (2)https://www.cnblogs.com/rimochiko/p/8168638.html 备 ...
最新文章
- AlphaGo之后,DeepMind重磅推出AlphaFold:基因序列预测蛋白质结构
- 机器学习和统计中的AUC
- idea集成spring+spring MVC+mybatis问题
- 多项式乘法c语言,急!!!!c语言:求n次多项式的加法和乘法
- OSPF多区域配置与汇总
- different way to retrieve SAP UI5 manifest
- php 枚举类型比较,枚举的比较-python编程入门系列图文教程-PHP中文网教程
- 大数据驱动乡村振兴共享共治机制研究
- 各国网络安全审查制度及案例分析
- 矩阵乘法c语言蓝桥杯,[蓝桥杯][基础练习VIP]矩阵乘法 (C语言代码)
- 使用bcryptjs对密码加密时,其校验原理是怎样的?
- PHP代码更新后画面不更新,为什么我的PHP代码不能更新SQL
- 【python写一个无限弹窗】
- Git 可视化工具 Fork 使用指南
- 使用SmartUpload上传文件报错
- NBA比赛数据table表格
- 基于英雄联盟寻路背景的A星算法及python实现
- 华盛顿大学计算机硕士什么时候录取,2020年华盛顿大学排名TFE Times美国最佳计算机科学硕士专业排名第5...
- 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
- 成考计算机专业难不难,成人高考计算机类难度大吗(成人大学难度)