codeup26826_最佳调度问题
时空限制 1000ms/128MB
问题描述
假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
编程任务
对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。
输入格式
由文件machine.in给出输入数据。第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。
输出格式
将计算出的完成全部任务的最早时间输出到文件machine.out。
输入样例
7 3
2 14 4 16 6 5 3
输出样例
17
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1005;
int n,k,a[N],b[N],ans=0x7fffffff;
void dfs(int x,int tot){ //第x个机器,所花时间tot
if (tot>=ans) return;
if (x>n){
if (tot<ans) ans=tot;
return;
}
for (int i=1; i<=k; i++)
if (b[i]+a[x]<=ans){
b[i] += a[x];
dfs(x+1,max(b[i],tot));
b[i] -= a[x];
}
}
int main(){
cin>>n>>k;
for (int i=1; i<=n; i++) cin>>a[i];
dfs(1,0);
cout<<ans<<endl;
return 0;
}