==================================================================
//批处理作业调度(回溯)
#include<stdio.h>
#define n 3//作业的数量
#define s 2//机器数
int M[n + 1][s] = {{0,0},{2,1},{3,1},{2,3}}; //申请一个(n + 1) * s的矩阵,这里为了方便读取和理解,第一行空出来
int x[n + 1];//借助此数组实现对n个作业的全排列
int bestx[n + 1];//用于保存最佳的作业调度方案
int best=100000;//保存最少的作业调度时间
int f1 = 0,f2[n + 1] = {0};//f1表示0`t作业在机器1上所用的时间,f2数组用于保存每一个作业的在机器2上的结束时间
int temp;
int f = 0;
void nfs(int t){
int i;
if(t == n + 1){
if(best > f){
for(i = 1;i <= n;i ++)
bestx[i] = x[i];
best = f;
}
return;
}
if(f < best){
for(i = t;i <= n;i ++){//x的全排列
f1 += M[x[i]][0];
f2[t] = (f2[t - 1] > f1 ? f2[t - 1] : f1) + M[x[i]][1];
f += f2[t];
temp = x[i];x[i] = x[t];x[t] = temp;
nfs(t + 1);
temp = x[i];x[i] = x[t];x[t] = temp;
f -= f2[t];
f1 -= M[x[i]][0];
}
}
}
int main()
{
int i;
for(i = 1;i <= n;i ++){
x[i] = i;
}
nfs(1);
for(i = 1;i <= n;i ++){
printf("%d ",bestx[i]);
}
putchar('\n');
printf("%d",best);
return 0;
}