【回溯算法】最佳调度问题

算法实现题 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
*/

 

上一篇:监控达梦表空间的使用率


下一篇:【数字信号调制】基于matlab多进制数字频率调制(4FSK)【含Matlab源码 999期】