#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;
}