【算法】批作业处理调度问题(回溯法)

在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;

int BatchJob(int a[],int b[],int n)
{
	int i,k;
	int x[10],sum1[10],sum2[10];  // 假设最多9个作业
	int bestTime = 1000;  // 假定最后完成时间不超过1000
	// 初始化调度方案 
	for(i=1;i<=n;i++){  
		x[i] = -1;
		sum1[i] = 0;
		sum2[i] = 0;
	} 
	// 开始调度(初始迭代)时使用 
	sum1[0] = 0; 
	sum2[0] = 0;
	k = 1; // 调度第1个作业
	while(k>=1){   // ??
		x[k]++;  // 安排第k个作业,x[k]为作业编号
		while(x[k]<n){
			for(i=1;i<k;i++) // 检测作业x[k]尚未处理 
				if(x[i]==x[k]) break;
			if(i==k){  // 作业x[k]尚未处理 
				sum1[k] = sum1[k-1]+a[x[k]];
				if(sum1[k]>sum2[k-1])
					sum2[k] = sum1[k]+b[x[k]];
				else
					sum2[k] = sum2[k-1]+b[x[k]];
				if(sum2[k]<=bestTime) break;
				else x[k]++; // 已超过目前最短时间,剪枝		
			}
			else x[k] = x[k]+1; // 作业x[k]已处理,尝试下一个作业 
		} 
		if(x[k]<n && k<n)
			k++; // 安排下一个作业
		else{
			if(x[k]<n && k==n)  // 得到一个作业安排 
				if(bestTime>=sum2[k]){
					bestTime = sum2[k];
					cout<<"目前的最短作业安排是:";
					for(int j=1;j<=n;j++)
						cout<<x[j]+1<<" "; // 作业编号从1开始
					cout<<"最短时间是:"<<bestTime<<endl; 
				} 
			// 重置x[k],回溯 
			x[k] = -1;
			k--;
		} 
	} 
	
	return bestTime;
}

int main()
{
	int a[] = {2,5,4};  // 第1个机器的时间
	int b[] = {3,2,1};  // 第2个机器的时间
	cout<<BatchJob(a,b,3)<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值