在Java中使用递归的加权区间调度

时间:2013-10-27 22:23:56

标签: java recursion

加权区间调度问题是这样的:给定一组加权区间,选择一组非重叠区间,使得总权重最大。 加权区间x可以用三倍x =(s,f,v)表示, 哪里 s = x的开始时间,f = x的结束时间,v =重量或x的值 这些加权间隔可以由三元组表示 (0,3,3)(1,4,2)(0,5,4)(3,6,1)(4,7,2)(3,9,5)(5,10,2)( 8,10,1) 编写程序来计算加权区间调度问题的解决方案。 这是图表的图片: http://imgur.com/vZn04xn

程序应打印出最佳总重量的值 解决方案和所选间隔的索引。在上面的例子中,输出 会是这样的(这个输出是不正确的)      最佳价值:7      区间序列:2 5 程序必须使用递归。

计算最佳值的算法是: 输入:n,s1,...,sn,f1,...,fn,v1,...,vn

按完成时间排序作业,以便f1&gt; f2&gt; ...&gt; FN。 计算p(1),p(2),...,p(n) 其中p(j)=最大指数i < j使得作业i与j兼容。

for j = 1 to n
   M[j] = empty <-- solution table
M[j] = 0

M-Compute-Opt(j) {
   if (M[j] is empty)
      M[j] = max(wj + M-Compute-Opt(p(j)), M-Compute-Opt(j-1))
   return M[j]
}

我创建了一个有3个整数的Job类:start,finish和weight。 我有一个类型作业的数组,每个不同的区间在8号阵列的每个点。 题: 如何计算每个作业间隔的p?

2 个答案:

答案 0 :(得分:0)

听起来像动态编程可以解决的问题。

对于从1到n的每个i,保存您可以安排的最大权重,以及用于这些权重的最后一个间隔的结束日期。您只存储有趣的权重。例如,间隔1 + 4(w = 4)不如间隔3(w = 4)有趣,因为后者在前者之前结束且总重量相同。

动态编程的技巧是将一个项目从1移动到n。在每个步骤中,确定该步骤中可用的新数据是否会导致更好的答案,不同的可能答案或更糟糕的答案。在进入下一步之前,只需要保存更好和不同的答案。

date    max weight  last interval
1       0           0
2       0           0
3       3           1
4       3           1
5       3 or 4      1 or 3 
6       4           3
7       4 or 5      3 or 5
8       4 or 5      3 or 5
9       5 or 8      5 or 6 
10      last step is for you, if I did not make mistakes in other rounds...

答案 1 :(得分:0)

这可能会有所帮助.....

public static int p(int index){
    for(int i=(index-1); i >=0; i--){
        if(f[i] <= s[index-1])  return i;
    }
    return -1;
}