算法实现题 5-15 最佳调度问题
问题描述:假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
算法设计:对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。
输入:给出输入数据。第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。
输出:将计算出的完成全部任务的最早时间输出
输入
7 3
2 14 4 16 6 5 3
输出
17
按照书上解答书给的函数写的。做了一点点的更改。
#include <bits/stdc++.h> using namespace std; int n,k; int a[999]; int len[999];//记录当前晚上前i个任务需要的时间 int best=999;//记录最小的时间 void backtrack(int dep) { if(dep==n) { int tmp=0; for(int i=0; i<k; i++) { if(len[i]>tmp) tmp=len[i];//找出k个机器中时间最长的 } if(tmp<best)//如果时间小于之前的best,更新数据 best=tmp; return ; } for(int i=0; i<k; i++) { len[i]=len[i]+a[dep]; if(len[i]<best) backtrack(dep+1); len[i]=len[i]-a[dep];//回溯 } } int main() { cin>>n>>k; for(int i=0; i<n; i++) cin>>a[i]; backtrack(0); cout<<best<<endl; return 0; } /* 输入 7 3 2 14 4 16 6 5 3 输出 17 */