活动安排问题-贪心算法

Posted 雷八天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了活动安排问题-贪心算法相关的知识,希望对你有一定的参考价值。


  

  
  
   贪心算法:贪心算法总是做出在当前看来最好的选择,也就是贪心算法不从整体最优化的角度考虑。它所做出的选择只是在某种意义上的局部最优选择
  
  

  
  
   性质:最优子结构性质
  
  
   当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质
  
  

  
  
   与动态规划的差异:
  
  
   贪心算法从局部出发,每一次得到的最优解,在考虑求解最优解的时候沿用上一次的最优解,之前的最优解不做保留。
  
  
   动态规划从全局出发,全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。
  
  

  
  
   经典贪心算法,例如: 图的单源最短路径问题,最小生成树问题
  
  

  
  
   活动安排问题
  
  

  
  
   例:设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:
  
  
       
  
  
   
  
  


package com.arithmetic.interview;

/**
 * Created by leiqiao on 2017/11/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相容。
 * 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
 */
public class test04_huodonganpai 
    private static int [] s = 1,3,0,5,3,5,6,8,8,2,12;
    private static int [] f = 4,5,6,7,8,9,10,11,12,13,14;
    private static int countLength = 11;
    private static boolean a[] = new boolean[countLength];
    public static int greedySelector(int s[], int f[], boolean [] a)
        //数学归纳法得出最优解一定包含第一个活动,
        //且需要注意的是,活动的结束时间升序
        int activityIndex = 0;
        a[activityIndex] = true;
        int activityCount = 1;
        for (int i = 1; i < countLength; i++)
            if(s[i] > f[activityIndex])
                activityIndex = i;
                a[i] = true;
                activityCount++;
            
        
        return activityCount;
    
    public static void main(String [] args)
        System.out.println(greedySelector(s, f, a));
        for(int i = 0; i < a.length; i++)
            if(a[i])
                System.out.println("活动" + (i+1) + " ");
            
        
    


以上是关于活动安排问题-贪心算法的主要内容,如果未能解决你的问题,请参考以下文章

suseoj 1210: 会场安排问题 (贪心)

算法设计与分析贪心算法--活动安排问题

会场安排问题

[nyoj]会场安排问题-贪心

nyoj 14-会场安排问题 (贪心)

PTA 会场安排问题 贪心