装配线调度问题
參考:http://www.cnblogs.com/submarine/archive/2011/06/11/2078636.html 裝配一輛汽車,有兩條裝配線分別有n個裝配點,每條裝配線在進出所花時間為e[i],x[i] (i=0,1),每個裝配點所需時間a[i][j](i=0,1;j=1,2,...,n),從一條裝配線i的第j個裝配點到另一條裝配線的第j+1個裝配點所需時間t[i][j](i=0,1;j=1,2,...,n-1). S[1,1]處理完成所經歷的時間 = e1 + a[1,1]; S[1,j]?(2<=j<=n)處理完成所經歷的時間 =min {S[1,j-1] 處理完成所經歷的時間 + a[1,j], S[2,j-1]處理完成所經歷的時間 + t[2,j-1] + a[1,j]}; “出口”處理完成所經歷的時間 = min {S[1,n]處理完成所經歷的時間 + x[1], S[2,n]處理完成所經歷的時間 + x[2]}。 于是得到以下遞推式(截至《算法導論》): # define MAX n;
int way[3][MAX + 1];void FindWay(int e[3], int a[3][MAX + 1], int t[3][MAX + 1], int x[3], int sum[3][MAX + 1])
{int i, j, k;sum[1][1] = e[1] + a[1][1];sum[2][1] = e[2] + a[2][1];for (i = 2; i <= MAX; i++){//line 1if (sum[1][i - 1] + a[1][i] > sum[2][i - 1] + t[2][i - 1] + a[1][i]){sum[1][i] = sum[2][i - 1] + t[2][i - 1] + a[1][i];way[1][i] = 2;//way[1][i]記錄station[1][i]的前一個station所屬的line
}else{sum[1][i] = sum[1][i - 1] + a[1][i];way[1][i] = 1;}//line 2if (sum[2][i - 1] + a[2][i] > sum[1][i - 1] + t[1][i - 1] + a[2][i]){sum[2][i] = sum[1][i - 1] + t[1][i - 1] + a[2][i];way[2][i] = 1;}else{sum[2][i] = sum[2][i - 1] + a[2][i];way[2][i] = 2;}}if (sum[1][MAX] + x[1] > sum[2][MAX] + x[2]){cout << "mintime:" << sum[2][MAX] + x[2] << endl;PrintWay(2);}else{cout << "mintime:" << sum[1][MAX] + x[1] << endl;PrintWay(1);}
}void PrintWay(int exitline)//反序輸出
{int i;cout << "line:" << exitline << "-->" << "station:" << MAX << endl;for (i = MAX; i >=2 ; i--){cout << "line:" << way[exitline][i] << "-->" << "station:" << i - 1 << endl;exitline = way[exitline][i];}
} View Code
?
轉載于:https://www.cnblogs.com/mmcmmc/p/3892124.html
總結
- 上一篇: 线段树(成段更新,区间求和lazy操作
- 下一篇: c++时间处理