活动选择贪心方法(修改)

时间:2012-10-03 05:19:53

标签: algorithm greedy

  

可能重复:
  Algorithm to find the maximum sum in a sequence of overlapping intervals

我正在解决以下修改后的活动调度(贪婪方法)问题:

给定n个活动的集合S和开始时间, Si fi ,完成 ith 活动的时间。同时给予权重 wi Foo为进行第i次活动所赚取的费用

问题是选择最大化foo收入的活动。我们必须返回foo可以获得的最高成本。假设Foo一次只能处理一个活动

请注意:

这类似于经典Activity selection problem,这里唯一的区别是,对于每项活动,我们都会获得成本wi。这里的目标太不同了 - 而不是找到相互兼容的活动的最大尺寸集,在这个问题中,我们必须找到最大化foo总收入的那些活动集。

实施例

Total activities N=4
Si fi wi
0 1 4000
2 5 100
1 4 3000
4 5 2500

Max earning=9500 (Answer)

如何修改经典贪婪活动选择算法,以解决此问题。我应该用什么逻辑来解决上述问题?

1 个答案:

答案 0 :(得分:6)

我不知道如何贪婪地解决这个问题。我能看到的解决方案是动态编程,你必须解决子问题

F(n)= Foo在第n天之后才能获得的最大利润是什么?

然后递归公式是明确的:我们假设F(n)等于F(n + 1)(在Foo不在第n天工作的情况下),或等于最大值F(fi)+ wi,对于每个以时间si = n开始的活动。

编辑:假设活动的结束时间是f0 <= f1&lt; = f2&lt; = ...&lt; = fN。然后答案是F [f0](从f0开始的最佳利润是什么),它可以计算为:

for n = N to 0:
    F[fn] = F[fn+1]
    for each activity (si, fi, wi):
         if si == fn: 
             F[fn] = max(F[fn], F[fi] + wi)

如果活动根据其开始时间按非递增顺序排序,则此方法的复杂性在活动数量上是线性的(因为当si