问题描述
假设有m本书(编号为1,2,…,m),想将每本书抄写一份,m本书的页数可能不同(分别是p1,p2,…,pm)。现将m本书分给k个抄写员(k<=m),每本书只能分配给一个抄写员进行复制,而每个抄写员所分配到的书必须是连续顺序的。意思是说,存在一个连续升序数列0=b[0]<b[1]<b[2]<…<b[k-1]<b[k]=m,这样,第i号抄写员得到的书稿是从b[i-1]+1到b[i]本书。抄写完所有书稿所需时间取决于分配得到最多工作的那个抄写员的抄写时间。试找一个最优分配方案,使分配给这k个抄写员抄写这m本书时,完成所有抄写任务的时间最少。
输入
输入由若干测试数据组成。每组测试数据有两行,第一行两个数是m,k分别表示书本数目与抄写人数;第二行是m个由空格分隔的整数p1,p2,…,pm,表示m本书中每本的页数(1<=k<=m<=500),这m个整数均为正整数且都不超过1000000。
输出
对第i组测试数据,输出一行。先输出“Case i:”,接着输出这k个抄写员抄写这m本书时,完成所有抄写任务的最少时间。
输入样例
9 3
1 2 3 4 5 6 7 8 9
输出样例
Case 1:17
分析:
该题中m本书是顺序排列的,k个抄写员选择书也是顺序且连续的。不管以书的编写,还是以抄写员作为参变量划分阶段,符合策略的最优化原理和无后效性 。考虑到k<=m,以抄写员编号来划分会方便些。
设f[i][j]为前i个抄写员复制前j本书的最小完成时间数。考察第i人的抄写情况。设前面t本书由前i-1人抄写,而从第t+1,t+2,…,j本书由第i人抄写,于是便有状态转移方程
其中,1<=i<=k, i<=j<=m,初始时,F[1][1]=p1。又当f[k][m]=max{pt}(1<=t<=m)。
问题变为:计算F[k][m]。
计算最优值:按自底向上方式求解。
参考程序: