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


    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

  • 相关阅读:
    SnakeYaml的不出网反序列化利用分析
    生态环境影响评价制图流程
    浅谈免杀下的持久化
    【培训课程专用】中断路由代码导读:当cpu运行在TEE来了一个Secure Group1中断
    C语言之自定义类型_结构体篇(1)
    【COSBench系列】1. COSBench认识、使用、结果分析
    李沐《动手学深度学习》d2l——安装和使用
    ubuntun系统更换清华源
    如何从回收站恢复已删除的文件
    为什么跨境电商独立站要屏蔽国内卖家和非目标国家访问
  • 原文地址:https://blog.csdn.net/m0_62089210/article/details/128042275