c++ 算法设计与分析(第四版) 流水作业调度
2015-10-24 23:13
337 查看
//DP算法--流水作业调度 #include <iostream> using namespace std; class Jobtype { public: int operator <= (Jobtype a) const { return (key <= a.key); } int key , index; bool job; }; //冒泡排序 void Sort(Jobtype *d , int n) { int i , j ,flag; Jobtype temp; for (i = 0 ; i < n ; i++){ flag = 0; for (j = n-1 ; j > i ; j--) { //如果前一个数大于后一个数,则交换 if (d[j] <= d[j-1]) { temp = d[j]; d[j] = d[j-1]; d[j-1] = temp; flag = 1; } } //如果本次排序没有进行一次交换(已排好序),则break,减少了执行时间。 if (flag == 0) { break; } } } //调用流水作业算法 int FlowShop(int n , int a[] , int b[] , int c[]) { Jobtype* d = new Jobtype ; for (int i = 0 ; i<n ; i++) { d[i].key = a[i] > b[i] ? b[i] : a[i]; //按Johnson法则分别取第i个作业的a[i]或b[i]值作为关键值 d[i].job = a[i] <= b[i]; //给符合条件a[i]<b[i]的放入到N1子集标记为true d[i].index = i; } //排序 Sort(d,n); //按关键字排序 int j = 0 , k = n-1 ; for (i = 0 ; i < n ; i++) { if ( d[i].job) c[j++] = d[i].index; //将排过序的数组d,取其中作业序号属于N1的从前面进入 else c[k--] = d[i].index; //属于N2的从后面进入,从而实现N1的非减序排序,N2的非增序排序 } j = a[c[0]]; k = j + b[c[0]]; for (i = 1 ; i < n ; i++) { j += a[c[i]]; //M1在执行c[i]作业的同时,M2在执行c[i-1]号作业,最短执行时间 //取决于M1与M2谁后执行完 k = j < k ? k+b[c[i]] : j+b[c[i]]; //计算最优加工时间 } delete d; return k; } int main() { int n; int *a , *b , *c; cout << "输入作业数: \n"; cin >> n; a = new int ; b = new int ; c = new int ; cout << "输入M1上加工时间a[]: \n"; for (int i = 0 ; i< n ; i++) { c[i] = 0; cin >> a[i] ; } cout << "输入M2上加工时间b[]: \n"; for (i = 0 ; i< n ; i++) { cin >> b[i]; } //调用流水作业调度算法 cout << "完成作业所需最短时间为: " << FlowShop(n , a , b , c) << endl; cout << "编号从0开始,作业调度的顺序为: \n"; for (i = 0 ; i < n ; i++) { cout << c[i] << " "; } cout << endl; return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)