可能重复:
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)
如何修改经典贪婪活动选择算法,以解决此问题。我应该用什么逻辑来解决上述问题?
答案 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