C++_活动安排问题

本文介绍了使用C++解决活动选择问题,旨在选取最大兼容活动集。通过回溯算法,结合数组s[N]、m[N]和v[N]进行求解,并给出了具体的测试用例和结果,展示了最大兼容活动集合。算法在解决数据量大的最优解问题上有应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述、

问题描述:有一个由n个活动组成的集合S = {a1, ..., an}

1. 这些活动使用同一个资源,而这个资源在某一时刻只供一个活动使用

2. 每个活动都有一个开始和结束时间si/fi;如果被选中,则任务ai发生在半开时间区间[si, fi)

3. 如果两个活动ai和aj不重叠,则称两个活动兼容

活动选择问题,希望选出一个最大兼容活动集

设计思路

设计思路:采用回溯求解算法,用数组s[N]来存放事件的开始及其结束时间,m[N]存放当前得到的最大兼容活动集,v[N]存放当前最大兼容活动集的开始机器结束时间,Vmax表示当前最大兼容活动集的活动数。若事件可进栈(与已在栈中元素无时间冲突),则进栈,若无事件可继续进栈,则此时活动总数与Vmax比较,若大于Vmax,则替换Vmax和v[N]和m[N],若i>n,则需退栈,若此时栈空,则结束运行并输出此时Vmax, v[N], m[N]。

数据结构:

s[N]来存放事件的开始及其结束时间,

m[N]存放当前得到的最大兼容活动集,

v[N]存放当前最大兼容活动集的开始机器结束时间

a[N]为工作数组,存放当前栈内活动,

Vmax表示当前最大兼容活动集的活动数

算法描述:

ARRANGE(s[N], m[N], v[N], a[N], Vmax)

Input(s[N])

Top<-0; i<-1;c<-0;

While(i<N) do

  For j=0 to top

    If(s[i]∈a[j]) then c=1, end(for)

    If(c!=1) then

      {a[top]=s[i];b[top]=I;top++;vi++}

    C<-0;

    If(vi>Vmax) then { Vmax=vi; v[t]=a[t]; m[t]=b[t]}

    Else { if (i=N-1 AND top>0) then top

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值