非重叠区间与总重量W的最大总和

时间:2013-03-10 11:09:27

标签: algorithm dynamic-programming

给定S整数N和正整数W的序列For a chosen interval [i,j]: - Weight([i,j]) = j-i+1 - Sum([i,j]) = S[i+1] + S[i+2] + ... + S[j]. ,找到一组非重叠区间,使得它们的总权重正好为W,并且它们的总和最大化

S = (12, 9, 1, 2, 8, -1), W = 4  

Choose [1,2] and [4,5] with total_sum = Sum([1,2]) + Sum([4,5]) = 9 + 8 = 17

(12 9 _ 2 8 _)

实施例

P[i][k] be the maximum total sum of the first i elements, using only k elements

这个问题听起来有点像背包问题和加权间隔调度,但我认为这可以用更简单的方式解决。

我的想法是使用动态编程并让P[N][W],答案是{{1}},但我无法想出子问题之间的关系。

2 个答案:

答案 0 :(得分:1)

如果你从左到右工作,你可以通过陈述来总结一个答案:

1)它的重量

2)该答案中最右边间隔的右端

3)其间隔中元素的总和

所以我认为你可以用一个从左到右运行的动态程序解决这个问题,如果在每个阶段,对于最右边间隔和总重量的右端的每个可能组合,你用最大的总和来跟踪答案。

答案 1 :(得分:0)

不应该是:

  f[i][j]= MAX( f[i-1][j] , f[i-T][j-Weight[i-T,i]]+Sum[i-T,i] );

然后你在f[N][W]得到答案。我很确定应该有一些方法来优化这个O(N^2W)解决方案以获得更好的解决方案。但既然你没有要求更快的......