加权区间调度问题是这样的:给定一组加权区间,选择一组非重叠区间,使得总权重最大。 加权区间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?
答案 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;
}