本文共 944 字,大约阅读时间需要 3 分钟。
批处理作业调用,第一行n ,n小于等于15,n行每行两个整数,输出最有调度序列。一行输出,空格分割,最后加空格,总时长。
/*嗯,时间紧迫,生怕下次来补充的时候,自己都看不懂代码所以还是简单介绍下。x,bestx,m分别代表的是当前作业调度————其中一种排列顺序,当前最优作业调度,各作业所需的处理时间。f1,f2,cf分别代表机器1完成处理时间,机器2完成处理时间,完成时间和*/#includeusing namespace std;int x[100];int bestx[100];int m[100][100];int f1=0;int f2=0;int cf=0;int bestf=10000;//当前最优值,即最优的处理时间和int n;//作业数void swap(int &a,int &b){ int temp=a; a=b; b=temp;}void Backtrack(int t){ //t用来指示到达的层数(第几步,从0开始),同时也指示当前执行完第几个任务/作业 int tempf,j; if(t>n) //到达叶子结点,搜索到最底部 { if(cf f2?f1:f2)+m[x[j]][2];//保存当前作业在机器2的完成时间 cf+=f2; //在机器2上的完成时间和 //如果该作业处理完之后,总时间已经超过最优时间,就直接回溯。 //剪枝函数 if(cf >n; for(i=1; i<=2; i++) //i从1开始 for(j=1; j<=n; j++) cin>>m[j][i];//第j个作业,第i台机器的时间值 for(i=1; i<=n; i++) x[i]=i;//初始化当前作业调度的一种排列顺序 Backtrack(1); cout< << endl; return 0;}
转载地址:http://jrucb.baihongyu.com/