活动安排问题 贪心法解决


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

      

用word画的,质量不是很好,凑合着看吧先。。。 可以看出来,贪心法先放最大的最后却不一定得到最大的价值。所以用贪心法解决0-1问题是不靠普的。说着说着就有点离题了~\(≧▽≦)/~啦啦啦

今天写的问题的 活动安排问题,使用的是贪心法来解决的。

问题描述:

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

 问题解析:

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

 下面是我写的c语言代码,虽然代码不全是自己写的(看了课本写的),但是代码运行还是没有发现错误滴。。。自己运行着没有错误。。。

 

#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 ");
}

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM