【算法】贪心算法(greedy)之活动安排问题

贪心算法概述

顾名思义:总是做出当前看来最优的选择,并不是整体上最优加以考虑,最初的选择只是在某种意义上的局部最优选择。

  • 活动安排问题:要求高效地安排一系列争用某一公共资源的活动,使尽可能多的活动能够兼容地使用公共资源。
    • n个活动的集合,每个活动都有开始时间s和结束时间f,
    • 思想:按照结束时间非减排序,安排的活动不产生冲突,也就是前一个问题的结束时间f要小于下一个问题的开始时间s,满足条件即可进行活动安排。

java代码

int[] s //表示每个活动的开始时间
int[] f //表示每个活动的结束时间
boolean[] a //表示活动是否被选入
public class ActionOrder {
    public int greedySelector(int[] s, int[] f, boolean[] a){
        int n = s.length - 1;
        a[1] = true;
        int j = 1;
        int count = 1;  //已选中第一个活动
        for (int i = 2; i <= n; i++){
            if (s[i] >= f[j]){
                a[i] = true;
                j = i;
                count++;
            }else {
                a[i] = false;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        //这里是已经按照结束时间 f[] 排好序的数组
        int[] s = {-1, 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
        int[] f = {-1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
        boolean[] a = new boolean[s.length];
        ActionOrder ac = new ActionOrder();
        int counts = ac.greedySelector(s, f, a);
        System.out.println("活动集合中最大相容活动数量为:" + counts);
        System.out.println(counts + "个活动依次是:");
        for (int i = 1; i <= s.length -1 ; i++){
            if (a[i]){
                System.out.println("第" + i + "个活动的开始时间:" + s[i] + ", 结束时间:" + f[i]);
            }
        }

    }
}
活动集合中最大相容活动数量为:4
4个活动依次是:1个活动的开始时间:1, 结束时间:44个活动的开始时间:5, 结束时间:78个活动的开始时间:8, 结束时间:1111个活动的开始时间:12, 结束时间:14

猜你喜欢

转载自blog.csdn.net/joker_Ling/article/details/108239472