贪心算法

基本思想

在对问题求解时,总是遵循某种规则做出在当前看来是最好的选择,期待通过所做的局部最优选择来产生一个全局最优解。

缺点

贪心算法不是对所有问题都能得到整体最优解。

例子

从前有一只鹅,一天可以下两个金蛋,但是在第一天直接杀了它可以拿到二十个金蛋。问如何在21天内拿到尽量多的金蛋?

动态规划:当n=21时会选择最后一天杀,能拿到40个金蛋;
贪心算法:第一天杀,能拿到20个金蛋。

结论:
贪心算法求解的结果不一定是全局最优解。但对于某些问题来说用贪心算法刚好能得到全局最优解。

例子出处

基本要素

1)贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择来得到;

证明方法:
首先考察一个问题的最优解,证明可修改该最优解,使得其从贪心选择开始也是最优的,然后用数学归纳法证明每一步都可以通过贪心选择得到最优解:
①假定首选元素不是贪心选择所要的元素,证明将首元素替换成贪心选择所需元素,依然得到最优解;
②数学归纳法证明每一步均可通过贪心选择得到最优解

2)最优子结构性质:一个最优策略的子策略总是最优的。

解题思路

1)分析问题,选择合适的贪心策略;
2)证明两个性质;
3)求解。

活动安排问题

问题描述

设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。 若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
活动安排问题就是在所给的活动集合中选出最大的相容活动子集合。

问题分析

可能的贪心选择策略:

1)每次选择开始时间最早的活动;
2)每次选择活动使用时间最少的活动;
3)每次选择结束时间最早的活动。

选择第3)作为贪心选择策略。

性质证明

贪心选择性质

证明:
假设有一个最优解A,其活动是以结束时间非减序进行排列的。再假设A中的第一个活动是K。通过贪心选择选择到的第一个活动记为活动1。
若k=1,则A是以活动1开始的;
若K≠1,则用活动1替换掉A中的活动K,因为end[1]≤end[K],活动1能与A中其他活动相容,所以证明了总存在一个以贪心选择开始的最优活动安排方案,即具有贪心选择性质。

最优子结构性质

证明:
通过贪心选择选择了活动1后,原问题化简为在剩下的活动中找与活动1相容的活动进行活动安排,也就是若A是原问题的最优解,则A’=A-{1}是活动安排问题E’=E-{1}的最优解,即贪心选择做出的每一次选择都会将问题化简为一个更小的与原问题具有相同形式的子问题。因此该问题具有最优子结构性质。

代码实现

#include <iostream>
#include <algorithm>
using namespace std;struct Activity{int num,start,end,mark;
};bool comp(Activity a,Activity b)
{return a.end<b.end;
}void Select(Activity act[],int n)
{int begin=act[1].start;for(int i=1;i<=n;i++)if(act[i].start>=begin){//如果活动相容 begin=act[i].end;act[i].mark=1;}
}int main()
{int n; cin>>n;Activity act[n+1];for(int i=1;i<=n;i++){cin>>act[i].start>>act[i].end;act[i].num=i;act[i].mark=0;}sort(act+1,act+n,comp);Select(act,n);for(int i=1;i<=n;i++)if(act[i].mark==1)cout<<act[i].num<<" ";
}/*
测试案例:
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
*/

讲解视频

活动安排问题-计算机算法相关推荐

  1. 活动安排问题(贪心算法)

    问题描述: 有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺 ...

  2. 活动安排问题--贪心算法

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...

  3. 小学计算机社团活动安排,小学计算机社团活动计划

    <小学计算机社团活动计划>由会员分享,可在线阅读,更多相关<小学计算机社团活动计划(4页珍藏版)>请在人人文库网上搜索. 1.计算机社团活动计划2017-2018学年第二学期新 ...

  4. 算法设计与分析——活动安排问题(Java)

    [问题]设有n个活动的集合E={1,2,-,n},其中每个活动都要求使用同一资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源.每个活动  都有一个要求使用该资源的起始时间  和一个结束时间 ...

  5. 贪心算法之 活动安排(Java代码实现)

    活动安排问题 – 资源争夺 问题描述 设有 n 个活动的集合 A = {1, 2, - , n}, 其中每个活动都要求使用同一资源,而在同一时间段内只有一个活动能使用资源 要求高效安排一系列争用公共资 ...

  6. 贪心算法-02活动安排问题

    活动安排问题 简介 活动安排问题是需要共享公共资源的一系列活动的高效安排问题,以在限定的资源前提下尽可能多地安排活动.一般,算法题中给出开始结束时间的活动序列都可以使用这种贪心思路. 问题描述 有若干 ...

  7. C++编程笔记:贪心算法实现活动安排问题

    问题描述: 设有n个活动的集合E={1,2,-,n},其中,每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且s ...

  8. 活动安排--贪心算法C语言实现

    一.前言 大三下的算法设计分析课程.每周必备二道算法题.头疼.自己写的,大家看看就行.题目,我就截图 ,懒得赋文字了. 二.内容 代码: #include<stdio.h> typedef ...

  9. 贪心算法-活动安排问题

    贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到 ...

最新文章

  1. vue的移动app项目中,自定义拖拽指令的问题
  2. 1024到了,默默给自己点个赞!
  3. 给matrix重新列名_如何认真升级Mac终端(甚至给它一个Matrix主题)
  4. 软考信息安全工程师学习笔记目录
  5. Loj #2324. 「清华集训 2017」小 Y 和二叉树
  6. selenium python怎么断言_如何为python / selenium中的特定元素断言文本?
  7. 李开复发布新书《AI未来》,答技术大变革下的生存法则,LeCun纳德拉推荐
  8. HDU 4379 水题,大水,但我WA了很多次,做了很久
  9. python_thrift
  10. 百度区块链 xuperchain 节点端 tps统计脚本
  11. 如何自动加载scratch3.0的页面上实现自动加载原有的作品
  12. 单片机AD采样的几种算法
  13. B树、B-树、B+树、B*树图文详解
  14. 鼠标悬停显示禁用图标
  15. 【每日蓝桥】16、一三年省赛Java组真题“幸运数”
  16. 视线语音鼠标 1 提纲
  17. java方向考什么证_java认证证书两个工作方向
  18. 投屏电视显示无法连接服务器,无法连接服务器.怎么办?
  19. 职场管理(1)——入职无法出示离职证明怎么办?别慌,这样也可以正常入职
  20. Linux 压缩文件和文件打包。

热门文章

  1. Linux入门篇01~~Linux的快速入门 (简洁,详细,基础)
  2. 编码:UTF-8编码、UTF-16编码规则
  3. 疯狂的程序员(绝影)
  4. Jmeter测试工具使用教程
  5. C语言提取gpgga例子
  6. 4月4日学习总结及次日计划
  7. openssl之EVP
  8. DMG转ISO文件在windows系统下的多种方法
  9. C/C++利用gotoxy()函数改变光标位置的实现方法
  10. 布谷鸟算法求解车间调度问题(书籍摘录版)