关于活动安排算法

原创 2013年12月05日 10:25:37

描述:

设有n个活动的集合E={1,2,.....,n},其中每个活动都要求使用同一个资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间Si和一个结束时间Fi,且Si<Fi。如果选择了活动i,则他在改时间区间[Si,Fi]内占用资源,若区间[Si,Fi] 和区间[Sj,Fj]不相交,则称活动i与活动j是相容的。活动安排问题是要求在所给的活动集合范围内选出最大的相容的活动子集。

贪心算法与动态规划的不同之处:

上次写的背包问题解决方法是动态规划,其实有的人一看到0-1背包问题时第一反应就是使用贪心法来解决问题但是贪心法求的结果并不一定就是最优解,下面是贪心算法活动安排的例子

问题分析:

查找每个活动的结束时间,每一次选择时查找具有最早结束时间的相容的活动,先把n个活动按时间的结束时间非减序排列,这样,贪心选择是取当前活动集合中结束时间最早的活动就归结为取当前活动集合中排在最前面的活动

#include<stdio.h>

void sort(int s[],int f[],int n)//把各个活动的起始时间和结束时间按结束时间递增排序

{

    int a,b;

    int i,j;

    for(i=0;i<n;i++)

    {

        for(j=i+1;j<n;j++)

        {

            if(f[i]>f[j])

            {a=f[i];f[i]=f[j];f[j]=a;

            b=s[i];s[i]=s[j];s[j]=b;}

        }

    }

}

int activemanage(int s[],int f[],bool a[],int n)

{

    a[0]=1;

    int i;

    int j=1,count=1;

    for(i=1;i<n;i++)

    {

        if(s[i]>=f[j])

        {

            a[i]=1;

            j=i;

            count++;

        }

        else a[i]=0;

    }

    return count;

}

 

void main()

{

    int i,n;

    int p;

    int s[100],f[100];

    bool a[100];

    printf("输入节目数:\n");

    scanf("%d",&n);

    printf("请依次输入节目的开始和结束时间\n");

    for(i=0;i<n;i++)

    {

        scanf("%d %d",&s[i],&f[i]);

    }

    sort(s,f,n);

    p=activemanage(s,f,a,n);

    printf("安排的节目个数为:%d\n",p);

    printf("节目的选取情况为(0表示不选 1表示选取):\n");

    for(i=0;i<n;i++)

        printf("%d ",a[i]);

    printf("\n");

}

 

结果:

输入节目书:

3

请依次输入节目的开始时间和结束时间

4:00 4:20 4:30 4:40 4:50 5:10

安排的节目个数为:3

节目的选取情况为<0表示不选,1表示选取>

1 1 1

 

 

算法设计与分析——活动安排问题——C语言

贪心策略:根据给的活动开始时间和结束时间,活动安排至少有三种看似合理的贪心策略可 供选择。 (1)每次从剩下未安排的活动中选择具有最早开始时间且不会与已安排的活动重叠的活动来安排,这样可以增大资源的...
  • henrytien
  • henrytien
  • 2015年01月26日 23:35
  • 2045

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

//活动安排问题public class Activearr{ public static int greedselector(int [] s,int [] f,boolean [] a) { i...
  • a9529lty
  • a9529lty
  • 2009年04月01日 21:44
  • 13663

算法Java实现--贪心算法--活动安排问题

活动安排问题算法的java实现(贪心算法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/86...
  • qipanliming
  • qipanliming
  • 2014年04月28日 17:27
  • 2715

贪心法求解活动安排(java实现)

贪心法描述: 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是...
  • JavaMan_chen
  • JavaMan_chen
  • 2012年11月29日 10:07
  • 4031

贪心算法-活动安排问题

贪心算法-活动安排问题 具体求解思路: 首先将活动按照结束时间从小到大排序, 然后将startTime[i]大于finishTime[i-1]的活动安排进去, 由于活动结束时间是事前排好序的(...
  • qq_19341327
  • qq_19341327
  • 2016年03月30日 15:00
  • 738

贪心算法基础之活动时间安排(二) 51nod 贪心教程

有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? 输入 第一行一个正整数n (n ...
  • winter2121
  • winter2121
  • 2017年05月09日 22:17
  • 386

Python实现--贪心算法与活动安排问题

参考:http://blog.csdn.net/liufeng_king/article/details/8709005 如题:给出一组活动,告诉每个活动的开始时间和结束时间,要求出算出能参加的最多...
  • qq_14908027
  • qq_14908027
  • 2017年12月17日 19:22
  • 164

【算法导论】贪心算法之活动安排问题

对于许多最优化问题来说,采用动态规划来求解最优解有点大材小用了,只需要采用更简单有效的贪心算法就行了。贪心算法就是所做的每一步选择都是当前最佳的,通过局部最佳来寻求全局最佳解。就像砝码称重一样,总是优...
  • tengweitw
  • tengweitw
  • 2013年11月27日 22:18
  • 2263

活动选择问题(1)-动态规划分析

数学问题一般分为三类 计数问题 存在问题 优化问题 对于活动选择问题,很多人应该对此感到很熟悉,它属于优化问题,问题描述: 假设有一组活动集合,S={s1,s2,...,sns_1,s_2,...
  • u010392759
  • u010392759
  • 2016年04月22日 00:53
  • 1051

活动安排问题的 动态规划和贪心算法

这篇文章主要用来记录我对《算法导论》 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解。 主要涉及到以下几个方面的内容: ①什么是活动选择问题---粗略提下,详细...
  • ustcyy91
  • ustcyy91
  • 2017年05月24日 21:28
  • 1068
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于活动安排算法
举报原因:
原因补充:

(最多只允许输入30个字)