7-5 最佳调度问题 (30分)
假设有n(n<=20)个任务由k(k<=20)个可并行工作的机器完成。完成任务i需要的时间为ti。 试设计一个算法,对任意给定的整数n和k,以及完成任务i 需要的时间为ti ,i=1~n。计算完成这n个任务的最佳调度,使得完成全部任务的时间最早。
输入格式:
输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。
输出格式:
将计算出的完成全部任务的最早时间输出到屏幕。
输入样例:
在这里给出一组输入。例如:
7 3 2 14 4 16 6 5 3
输出样例:
在这里给出相应的输出。例如:
17
代码:
#includeusing namespace std; int n; // n个等待分配的任务(时间) int k; // k个容器(机器) int best=999999; //最佳调度(最短时间),初始化为一个很大的数 int ti[30]; // 完成任务i所需要的时间为 time【i】 , 数组名用 time 会报错 int total[30]={0}; // 分配完任务后,第i个容器完成任务所需要的时间总和为 total【i】,初始化为 0 int dep=0; // 深度,tmie【dep】表示第dep个任务需要的时间, // 每次分配完 dep+1 , 当 dep == n 时可以得到一个分配方案, 并得到该方案所需要的时间 // 计算一种分配方案所需要的时间 int GetTime() { int temp=0; for(int i=0;i ) { temp = max(total[i],temp); //该分配方案所需要的时间 = 最后完成任务的那个容器所需要的时间 } return temp; } // 深度遍历 void search(int dep) //第dep个任务的分配 { if ( dep == n ) // 深度遍历到了叶子节点,得到一个分配方案,更新 best { int Total_Time = GetTime(); best=min(best,Total_Time); return ; } for(int i=0;i ) { total[i]=total[i]+ti[dep]; // 将任务dep分给机器i // 如果机器i完成任务所需要的时间 > best , 那就没有继续往下搜索的必要了 if( total[i] 1); // 继续分配第 dep+1 个任务 total[i]=total[i]-ti[dep]; // 回溯,任务dep不分给机器i //i++ , 继续讨论 任务dep分配给机器i+1的情况 } return ; } int main() { cin>>n>>k; for(int i=0;i ){ cin>>ti[i]; } search(0); // 从 第0个任务的分配开始 cout< endl; return 0; }