【发布时间】:2018-05-20 21:19:29
【问题描述】:
给定 n 个任务,每个任务可以在 1 个单位时间内执行,并且任务可以并行执行。每个任务只能在给定的时间范围内完成,例如在时间 t1 和 t2(包括两者)之间(t1
示例:对于 5 个任务 (n=5),
任务 1:{1, 5}
任务 2:{3, 4}
任务 3:{5, 6}
任务 4:{7, 12}
任务 5:{8, 100}
在这里我们最多可以执行 4 个任务。
任务 1 和 2 可以在 [3, 4] 之间的时刻执行,任务 4 和 5 可以在 [8, 12] 之间的时刻执行。
任务 1 和 3 可以在时刻 5 执行,任务 4 和 5 可以在 [8, 12] 之间的时刻执行。
现在这里是回溯算法的 C++ 版本:
int result = 0, n;
int task[1000][2];
//Checks if task overlaps with the time range [t1, t2]
bool taskFit(int &taskno, int &t1, int &t2){
if(task[taskno][1] < t1)return false;
else if(task[taskno][0] > t2)return false;
else return true;
}
void backtrack(int t1, int t2, int t3, int t4, int taskno, int grp1, int grp2){
//t1, t2 represultent time bounds for group1
//t3, t4 represultent time bounds for group2
//grp1: number of tasks that can be performed in time range of group1
//grp2: number of tasks that can be performed in second time stamp
result = max(grp1 + grp2, result);
if(result==n || taskno==(n+1))return;
//putting task in first group if it fits in the range of group1
if(taskFit(taskno, t1, t2))
backtrack(max(t1, task[taskno][0]), min(t2, task[taskno][1]), t3, t4, taskno+1, grp1+1, grp2);
//putting task in second group if it fits in its range
if(taskFit(taskno, t3, t4))
backtrack(t1, t2, max(t3, task[taskno][0]), min(t4, task[taskno][1]), taskno+1, grp1, grp2+1);
//simply ignoring the task
backtrack(t1, t2, t3, t4, taskno+1, grp1, grp2);
}
main(){
//...we have the value of n and time range of all n tasks
// for ith task time range in obtained as [task[i][0], task[i][1]]
//initially both groups are set in time range = [0, 2000000000]
//here we put the task1 in first group
//thus setting the new range for group 1
backtrack(task[0][0], task[0][1], 0, 2000000000, 2, 1, 0);
//ignoring the first task, the group ranges remain as it is
backtrack(0, 2000000000, 0, 2000000000, 2, 0, 0);
}
上述回溯算法为一个任务考虑了 3 种情况,它位于 group1 或 group2 或不属于任何组。
最初,组范围足够大,因此可以将所有任务放入其中,但是当我们将任务添加到组时,时间范围会收敛。
我知道这个算法可以正常工作,但是对于某些输入,它的复杂性是指数级的。
因此,是否可以优化此算法,或者我应该采用其他策略?如果应用了其他策略,请告诉我优化或概念。
【问题讨论】:
标签: c++ recursion backtracking recursive-backtracking