今天在百度知道上看到有人问这样一道题:
描述
有n个任务需要依次运行,第i个任务运行时需要占R[i]的空间,运行完成后仍然残留O[i]的空间( O[i]<R[i])。现在需要合理安排这些任务,使得运行完这些任务的需要的空间最小。
例如说,有两个任务,R[1]=10,O[1]=5,R[2]=8,O[2]=6。
如果先运行第1个任务,再运行第2个任务,则总共最多需要13的空间;
如果先运行第2个任务,再运行第1个任务,则总共最多需要16的空间;
因此选择第一种方式,使得占用空间最小。
输入
每组数据第一行为任务数 n (n <= 30),接下来的 n 行分别是对应的 R[i] O[i]。
输入以 0 结尾。
输出
对每组数据,输出所需的内存。
样例输入
2
10 5
8 6
5
5 5
4 4
3 3
2 2
1 1
0
样例输出
13
15
我的解答思路是
设Wi=Ri-Oi。只有两个任务t1,t2时,需要空间为V,需要最小空间实际为Vm
设先执行t1再执行t2表示为t1->t2,先执行t2再执行t1表示为t2->t1
则当t1->t2时,有V1=R2-R1+2O1;当t2->t1时,V2=R1-R2+2O2。
那么
V(t1->t2)=Vm(t1->t2)=min{V1,V2}
有了以上定义,能证明:对于任意的整数0<i<n,若V(ti->t(i+1)) =Vm(ti->t(i+1)),则
任务链满足t1->t2->...->ti->...tn时,有结论:
V(t1->t2...->tn)=Vmin(t1->t2..->tn)
这个结论还没有做严谨的证明,虽然我很想像数学老师一样,用“显然”来得到这个结论,但是作为一个严谨的YY者,日后一定要完成这个证明的
一句话就是,一个任务链中,任意相邻的两个任务