问题背景:

所谓“钟点秘书”,是指年轻白领女性利用工余时间为客户提供秘书服务,并按钟点收取酬金。“钟点秘书”为客户提供有偿服务的方式一般是:采用电话、电传、上网等“遥控”式
服务,或亲自到客户公司处理部分业务。其服务对象主要有三类:一是外地前来考察商务经营、项目投资的商人或政要人员,他们由于初来乍到,急需有经验和熟悉本地情况的秘书帮忙;二是前来开展短暂商务活动,或召开小型资讯发布会的国外客商;三是本地一些请不起长期秘书的企、事业单位。这些客户普遍认为:请“钟点秘书”,一则可免去专门租楼请人的大笔开销;二则可根据开展的商务活动请有某方面专长的可用人才;三则由于对方是临时雇用关系,工作效率往往比固定的秘书更高。据调查,在上海“钟点秘书”的行情日趋看好。对此,业内人士认为:为了便于管理,各大城市有必要组建若干家“钟点秘书服务公司”,通过会员制的形式,为众多客户提供规范、优良、全面的服务,这也是建设国际化大都市所必需的。某跨国公司总裁正分身无术,为一大堆会议时间表焦头烂额,希望高级钟点秘书能做出合理的安排,能在有限的时间内召开更多的会议。

问题分析:

这是一个典型的会议安排问题,会议安排的目的是能在有限的时间内召开更多的会议
(任何两个会议不能同时进行)。在会议安排中,每个会议 i 都有起始时间 bi 和结束时间 ei,且 bi<ei,即一个会议进行的时间为半开区间[bi,ei)。如果[bi,ei)与[bj,ej)均在“有限的时间内”,且不相交,则称会议 i 与会议 j 相容的。也就是说,当 bi≥ej 或 bj≥ei 时,会议 i与会议 j 相容。会议安排问题要求在所给的会议集合中选出最大的相容活动子集,即尽可能在有限的时间内召开更多的会议。在这个问题中,“有限的时间内(这段时间应该是连续的)”是其中的一个限制条件,也应该是有一个起始时间和一个结束时间(简单化,起始时间可以是会议最早开始的时间,结束时间可以是会议最晚结束的时间),任务就是实现召开更多的满足在这个“有限的时间内”等待安排的会议。

算法设计:

(1)初始化:将 n 个会议的开始时间、结束时间存放在结构体数组中(想一想,为什么
不用两个一维数组分别存储?),如果需要知道选中了哪些会议,还需要在结构体中增加会议编号,然后按结束时间从小到大排序(非递减),结束时间相等时,按开始时间从大到小排序(非递增);
(2)根据贪心策略就是选择第一个具有最早结束时间的会议,用 last 记录刚选中会议的
结束时间;
(3)选择第一个会议之后,依次从剩下未安排的会议中选择,如果会议 i 开始时间大于
等于最后一个选中的会议的结束时间 last,那么会议 i 与已选中的会议相容,可以安排,更新 last 为刚选中会议的结束时间;否则,舍弃会议 i,检查下一个会议是否可以安排。

通俗讲:先将数据存到结构体中,用结束时间从小到大排序(若结束时间相同,以开始时间由大到小排序),之后再次基础上再判断开始时间;在会议按结束时间非递减排序的基础上,首先选中第一个会议,用 last 变量记录刚刚被选中会议的结束时间。下一个会议的开始时间与 last 比较,如果大于等于 last,则选中。每次选中一个会议,更新 last 为最后一个被选中会议的结束时间,被选中的会议数counter加 1;如果会议的开始时间不大于等于 last,继续考查下一个会议,直到所有会议考查完毕。最后返回counter即可;

样例输入:

10//10个会议
3 6 //开始时间 结束时间
1 4
5 7
2 5
5 9
3 8
8 11
6 10
8 12
12 14

样例输出:

4

代码如下:

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;struct meet{//用结构体存储会议int begin1;//会议开始时间int end1;//辉夜结束时间int number;//会议编号
}a[1014];bool beyond(meet a,meet b){//按结束时间由早到晚排序if(a.end1 == b.end1) return a.begin1>b.begin1;//若结束时间相同,会议开始时间由晚到早排序return a.end1<b.end1;
}int main()
{int all;//总会议数int last;int counter=1;scanf("%d",&all);for(int i=0;i<all;i++){scanf("%d",&a[i].begin1);scanf("%d",&a[i].end1);a[i].number = i+1;//会议编号}sort(a,a+all,beyond);//会议结束时间由早到晚排序last = a[0].end1;//这里的last为结束最早的会议结束时间for(int j=1;j<all;j++){if(a[j].begin1 >= last){//然后找另一个比这个会议结束时间大的开始时间的会议counter ++;last = a[j].end1;}}printf("%d",counter);return 0;
}

0-1背包问题(物品不可分割)相关推荐

  1. 0/1背包问题——动态规划方法

    1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...

  2. 0/1背包问题-----回溯法求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  3. 0/1背包问题-----动态规划求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  4. 【动态规划】0/1背包问题

    问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec  内存限制: 64 MB 提交: 152  解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...

  5. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  6. 令人头疼的背包九讲(1)0/1背包问题

    点击上方"Jerry的算法和NLP",选择"星标"公众号       重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程 ...

  7. 算法之动态规划,问题三:0 1 背包问题

    目录 1 问题的描述 2 贪心算法? 3 算法的参数约定及递推式 4 算法具体实现 5 回溯原问题的解 6 案例输出 7 源代码 1 问题的描述 0 1 背包的问题: 有n个物品(权重Wi>0, ...

  8. 多米诺骨牌——变形版0,1背包问题

    多米诺骨牌--变形版0,1背包问题 1.题目描述 2.问题分析 3.算法源码 1.题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的上方块中点数之和记为S1,下方块中点数之和 ...

  9. 0/1背包问题(蛮力法)

    问题描述: 给定n个重量为{w1,w2,w3,....,wn}.价值为{v1,v2,v3,...,vn}的物品和一个容量为C的背包,0/1背包问题是求解这些物品中的一个最有价值的子集,并且要能够装到背 ...

  10. 分枝限界法求解0/1背包问题

    问题描述 有n个重量分别为{w1,w2,-,wn}的物品,它们的价值分别为{v1,v2,-,vn},给定一个容量为W的背包. 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中 ...

最新文章

  1. [SQL基础教程] 1-5 表的删除和更新
  2. Codeforces Round #321 (Div. 2) Kefa and Company 二分
  3. 开源软件 安全风险_3开源安全风险及其解决方法
  4. 云图说|分布式事务管理DTM:“买买买”背后的小帮手
  5. 【kafka】kafka 启动报错 InvalidReceiveException: Invalid receive (size = -720899)
  6. 导航类网站|设计没有感觉,苦于寻找各种工具 或者资料的小伙伴收藏好哦
  7. php fpm 日志记录,使用Nginx在PHP-FPM 7上启用错误日志记录?
  8. 解决virtualbox 虚拟机不能ping通win7
  9. 添加腾讯007防水墙
  10. 吴恩达-deep learning 02.改善深层神经网络:优化算法 (Optimization algorithms)Week2
  11. AQS: CLH 介绍
  12. U盘图标不显示(转)
  13. C++笔记 char
  14. C#编写的串口调试软件,下位机传过来的中文全是问号???
  15. VUE+Element-ui实战之el-calendar日历自定义显示内容
  16. 2020年史上最全移动端Web整理从开发基础到实战(四)
  17. c语言栈的实现以及操作
  18. Maya 更改模型枢轴位置 Day1
  19. 去哪儿VS携程产品分析
  20. python重点题目

热门文章

  1. android sqlite批量操作,Android: SQLite批量插入数据的最佳实践
  2. MapXtreme2008中操作矢量符号和定制符号
  3. js求渐升数的第100位
  4. JS对全角与半角的验证,相互转化以及介绍
  5. 移动端 flexible.js 布局详解
  6. intellij idea中解决java.lang.VerifyError: Expecting a stackmap frame at branch target的方法
  7. 软件测试中条件覆盖,路径覆盖,语句覆盖,分支覆盖的区别
  8. 东哥读书小记 之 《一个广告人的自白》
  9. Android 编程下 AlarmManager
  10. SendMessage和PostMessage