算法(c++)——活动安排问题
目录
一、问题描述
二、解题思路
三、代码
四、结果
五、总结
六、完整程序代码包
一、问题描述
活动安排问题:设有n个活动的集合{0,1,2,…,n-1},其中每个活动都要求使用同一资源,如会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间starti和一个结束时间endi,且starti<endi。如选择了活动i,则它在半开时间区间[starti,endi)内占用资源。若区间[starti,endi)与区间[startj,endj)不相交,称活动i与活动j是相容的。也就是说,当startj≥endi或starti≥endj时,活动i与活动j相容。活动安排问题就是在所给的活动集合中选出最大的相容子活动集合。运用贪心法解决该问题。
二、解题思路
将活动按照结束时间进行从小到大排序。然后用i代表第i个活动,s[i]代表第i个活动开始时间,f[i]代表第i个活动的结束时间。按照从小到大排序,挑选出结束时间尽量早的活动,并且满足后一个活动的起始时间晚于前一个活动的结束时间,全部找出这些活动就是最大的相容活动子集合。事实上系统一次检查活动i是否与当前已选择的所有活动相容。若相容活动i加入已选择活动的集合中,否则,不选择活动i,而继续下一活动与集合A中活动的相容性。若活动i与之相容,则i成为最近加入集合A的活动,并取代活动j的位置。
三、代码
#include <stdio.h>
#include <iostream>
using namespace std;template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[]);int main()
{int n;printf("请输入活动数量:");scanf("%d",&n);printf("\n");//下标从1开始,存储活动开始时间int s[n+1];//下标从1开始,存储活动结束时间int f[n+1];for(int i = 1; i<=n; i++){printf("请输入第%d个活动的开始时间:",i);scanf("%d",&s[i]);printf("请输入第%d个活动的结束时间:",i);scanf("%d",&f[i]);}printf("\n");bool A[n+1];GreedySelector(n,s,f,A);cout<<"最大相容活动子集为:"<<endl;for(int i=1;i<=n;i++){if(A[i]){cout<<"["<<i<<"]:"<<"("<<s[i]<<","<<f[i]<<")"<<endl;}}return 0;
}template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{A[1]=true;int j=1;//记录最近一次加入A中的活动for (int i=2;i<=n;i++)//依次检查活动i是否与当前已选择的活动相容{if (s[i]>=f[j]){A[i]=true;j=i;}else{A[i]=false;}}
}
四、结果
说明:此次测试的活动数量为4个,开始和结束时间依次是[1,3)、[4,6)、[2,5)、[1,7),经计算,最大相容活动子集为第一个和第二个活动,结果正确。
五、总结
1、贪心算法
(1)原理:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
(2)特性:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质。
1)贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素。贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。证明的大致过程为:首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。做了贪心选择后,原问题简化为规模更小的类似子问题。然后用数学归纳法证明通过每一步做贪心选择,最终可得到问题的整体最优解。其中,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。
2)最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
2、活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。
六、完整程序代码包
ShiYan3_HuoDongAnPaiWenTi.rar-讲义文档类资源-CSDN下载算法(c++)——活动安排问题更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/lcf0000/55689211
算法(c++)——活动安排问题相关推荐
- 算法笔记(0002) - 【贪心算法】活动安排问题
贪心算法 原理 在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许 ...
- 贪心算法解决活动安排-Python实现(排序+贪心选择)
贪心算法解决活动安排 问题 问题概述 分析问题 解决问题 编程 编程流程以及数据类型选择 发现问题以及解决 最终实现 总结 程序缺陷以及完善 解题心路历程 问题 问题概述 设有n个活动的集合E={1, ...
- 贪心算法之活动安排问题(填表详解+思路解析)
贪心算法 总是选择当前看起来最优的选择(局部最优解),得到的结果是一个整体最优解. 但是总是选择局部最优解并不总是能得到整体最优解,需要在问题具有:贪心选择性和优化子结构时才成立. 贪心选择性:第一次 ...
- 贪心算法之活动安排问题C语言代码
贪心算法之活动安排问题C语言 问题描述 该问题要求高效地安排一系列争用某一公共资源的活动. n:活动的个数,其中每个活动都要求使用同一资源,如演讲会场等.而且在同一时间内只有一个活动能使用这一资源. ...
- 贪心算法实现活动安排问题
贪心算法实现活动安排问题: 设有n个活动的集合E={1,2,...,n},其中,每个活动都要求使用同一资源,如演讲会场等,而在同一时间内,只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的 ...
- 贪心算法-02活动安排问题
活动安排问题 简介 活动安排问题是需要共享公共资源的一系列活动的高效安排问题,以在限定的资源前提下尽可能多地安排活动.一般,算法题中给出开始结束时间的活动序列都可以使用这种贪心思路. 问题描述 有若干 ...
- C++编程笔记:贪心算法实现活动安排问题
问题描述: 设有n个活动的集合E={1,2,-,n},其中,每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且s ...
- 贪心算法之 活动安排(Java代码实现)
活动安排问题 – 资源争夺 问题描述 设有 n 个活动的集合 A = {1, 2, - , n}, 其中每个活动都要求使用同一资源,而在同一时间段内只有一个活动能使用资源 要求高效安排一系列争用公共资 ...
- 【贪心算法】活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子. 该问题要求高效地安排一系列争用某一公共资源的活动. 贪心算法提供了一个简单.漂亮的方法使得尽可能多的 ...
- 基于贪心算法的活动安排问题
一.问题的描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动. 现在小刘有一些活动计划的 ...
最新文章
- ML 05、分类、标注与回归
- Requirejs定义模块
- django 不用自带的mysql_21_django配置使用mysql数据库的两种方式
- spring PathVariable
- epoll用法整理 实现回声服务端
- 整理Excel表格中的批注
- vue.js koa2 mysql_nodejs-koa2-mysql-sequelize-jwt
- 互联网公司面试必问的mysql题目
- 单幅RGB图像+Depth深度图得到点云模型示例
- psasp和matlab,MATLAB和PSASP电力系统潮流计算比较研究
- 98家央企及下属上市企业全名单(2023版)
- linux下磁盘检查修复命令e2fsck
- Deep Match to Rank Model for Personalized Click-Through Rate Prediction
- DD每周前端七题详解-第五期
- Nexus安装和使用
- maven命令错误:-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME
- 亲爱的老狼-css文字基本属性汇总
- ZigBee、WiFi、蓝牙的区别
- html+CSS让背景图片充满整个屏幕
- 账单管理系统(SpringCloud)