• 贪心算法—活动选择问题


    4.1 活动选择问题
    1.问题的理解与描述
    假定有n个需要使用同一个这样的资源的活动,每次只能有一个活动使用该资源。每一个活动有一个开始时间 si,一个完成时间 fi,其中0 ≤ si < fi < ∞。如果区间[si , fi)和[sj , fj)不相交,活动ai和aj是相容的(即如果si≥ fj 或 sj ≤ fi,ai和aj相容)。活动选择问题是选取一个由相容活动构成的最大集合。
    输入:按完成时间排好序的活动开始时间数组s,完成时间数组 f。
    输出:表示一个最大的相容活动组的向量{x1, x2, …, xn},其中

    xi={01第i个活动在此最大相容活动组中否则,i1,2,...,n。


    2.最优子结构
    定义集合
    Sij=ak∈S:fi≤sk 3.贪婪选择性
    定理4-1
    考虑任一非空子问题Sij,并设am为Sij中最早完成的一个活动:
    fm=minfk:ak∈Sij 。

    (1)活动 am 包含在 Sij 的一个最大相容活动子集合中。
    (2)子问题 Sim 是空的,所以选择 am 将使得 Smj 成为仅有的非空子问题。
    4.算法的伪代码描述

    1. RECURSIVE-ACTIVITY-SELECTOR (s, f, i, j)
    2. 1 m ← i + 1
    3. 2 while m < j 且 sm < fi 求Sij中的第一个活动
    4. 3 do xm←0
    5. 4 m ← m + 1
    6. 5 if m < j
    7. 6 then xm←1
    8. 7 RECURSIVE-ACTIVITY-SELECTOR (s, f, m, j)

    算法运行时间:Θ(n)

    5 C++代码实现

    1. #ifndef _GREEDYACTIVITYSELECT_H
    2. #define _GREEDYACTIVITYSELECT_H
    3. int* RecusiveActivitySelector(int* s, int* f,int i,int j);
    4. #endif
    1. #include "GreedyActivitySelect.h"
    2. int* RecusiveActivitySelector(int* s, int* f,int i,int j)
    3. {
    4. static int * x=new int[j];
    5. int m=i+1;
    6. while(m<j&&s[m]<f[i])//求s[ij]中的第一个活动
    7. {
    8. x[m]=0;
    9. m++;
    10. }
    11. if(m<j)
    12. {
    13. x[m]=1;
    14. RecusiveActivitySelector(s,f,m,j);
    15. }
    16. return x;
    17. }
    1. #include "GreedyActivitySelect.h"
    2. #include <limits>
    3. #include <iostream>
    4. using namespace std;
    5. int main(int argc,char** argv)
    6. {
    7. int* x;
    8. int s[]={0,1,3,0,5,3,5,6,8,8,2,12,numeric_limits<int>::max()},
    9. f[]={0,4,5,6,7,8,9,10,11,12,13,14,numeric_limits<int>::max()};
    10. x=RecusiveActivitySelector(s,f,0,12);
    11. for(int i=1;i<12;i++)
    12. cout<<x[i]<<" ";
    13. cout<<endl;
    14. delete[]x;
    15. system("pause");
    16. return (EXIT_SUCCESS);
    17. }

    运行结果:1 0 0 1 0 0 0 1 0 0 1

  • 相关阅读:
    单链表经典例题
    Docker安装Redis并使用Another Redis Desktop Manager连接
    C++ Tutorials: C++ Language: Program structure: Name visibility
    postgresql 行转列的例子
    MyBatis 与 MyBatis-Plus 的区别
    【工程应用十】基于十六角度量化的夹角余弦相似度模版匹配算法原理解析。
    Java基础:Java流程控制
    Ora2Pg工具迁移Oracle到openGauss
    Nginx的日志格式
    2020年美亚杯电子数据取证大赛-个人赛
  • 原文地址:https://blog.csdn.net/m0_62089210/article/details/128042275