zoukankan      html  css  js  c++  java
  • 贪心算法求解活动选择问题

    问题描述:

       有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每个活动a都有一个开始时间和结束时间,且 0<= s < f 。一旦被选择后,活动a就占据半开时间区间[s,f]。如果[si,fi]和[sj,fj]互不重叠,则称两个ai,aj活动是兼容的。该问题就是要找出一个由互相兼容的活动组成的最大子集.假设输入的活动集合S已经按照结束时间的单调递增顺寻进行了排序.

    i 1 2 3 4 5 6 7 8 9 10 11
    si 1 3 0 5 3 5 6 8 8 2 12
    fi 4 5 6 7 8 9 10 11 12 13 14

    求解思路:

      贪心算法的主要思想就是对问题求解时,总是做出在当前看来是最好的选择,产生一个局部最优解。

      在活动选择问题中,每次的贪心解就是选择Sij结束时间最早的活动,这样就给后面的活动留下了目前看来最多的时间。假设活动已经按照结束时间递增的顺序进行排序,那么我们只需要遍历一次所有活动就可以得到最大兼容活动子集了。

      

    /*************************************************************************
        > File Name: Activity_selector.c
        > Author: He Xingjie
        > Mail: gxmshxj@163.com
        > Created Time: 2014年05月28日 星期三 21时27分14秒
        > Description: 基于贪心算法的活动选择
     ************************************************************************/
    #include<stdio.h>
    
    #define MAX 11
    
    int s[MAX] = {1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
    int f[MAX] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
    
    void GreedyActivitySelector(int st, int fi)
    {
        int m, i;
    
        i = st;
        printf("a%d ", i+1);
        
        for (m=i+1; m < fi; m++)
        {
            if (s[m] >= f[i])
            {
                printf("a%d ", m+1);
                i = m;
            }
        }
        
        printf("
    ");
    }
    
    int main()
    {
        GreedyActivitySelector(0, MAX);
    
        return 0;
    }

    参考:

    http://blog.163.com/computer_freshman/blog/static/201131246201221105139572/

     

  • 相关阅读:
    线段树
    数据结构<三> 队列
    数据结构<二>双向链表
    数据结构<一>单链表
    扩展欧几里德算法
    90 个 node.js 扩展模块,我们疯了
    nodejs的查询构造器
    express的路由配置优化
    express路由方案
    Redis学习笔记~目录
  • 原文地址:https://www.cnblogs.com/Jason-Damon/p/3774489.html
Copyright © 2011-2022 走看看