#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn = 10000;
int f1[maxn], f2[maxn]; //保存最优解
int a[3][maxn]; //每个装配站所用的时间
int t[3][maxn]; //装配线调度所用的时间
int l[3][maxn]; //保存选择的路线,以便打印路径。
int e1, e2;
int x1, x2;
int res;
int res1; //代码最后一个装配站的标号是1还是2.
int n; // 代表装配线的长度。
//P193页(第二版)
void init() {
scanf("%d%d", &e1, &e2);
for(int i = 1; i<=n-1; i++) {
scanf("%d%d", &a[1][i], &a[2][i]);
scanf("%d%d", &t[1][i], &t[2][i]);
}
scanf("%d%d", &a[1][n], &a[2][n]);
scanf("%d%d", &x1, &x2);
}
int fast_way(){
f1[1] = e1 + a[1][1];
f2[1] = e2 + a[2][1];
for(int i = 2; i<=n; i++) {
if(f1[i-1]+a[1][i] <= f2[i-1]+a[1][i]+t[2][i-1] ) {
f1[i] = f1[i-1] + a[1][i];
l[1][i] = 1;
}else{
f1[i] = f2[i-1] + a[1][i] + t[2][i-1];
l[1][i] = 2;
}
if(f2[i-1]+a[2][i] <= f1[i-1]+a[2][i]+t[1][i-1]){
f2[i] = f2[i-1] + a[2][i];
l[2][i] = 2;
}else{
f2[i] = f1[i-1] + a[2][i] + t[1][i-1];
l[2][i] = 1;
}
}
if(f1[n]+x1<=f2[n]+x2){
res = f1[n] + x1;
res1 = 1;
}else{
res = f2[n] + x2;
res1 = 2;
}
return res;
}
void print_station(){//打印路径
int i = res1;
int j;
printf("line:%d, station:%d\n", i, n);
for( j = n; j >= 2; j--) {
i = l[i][j];
printf("line:%d, station:%d\n", i, j-1);
}
}
int main()
{
while(scanf("%d", &n) != EOF) {
init();
int result = fast_way();
cout << result << endl;
print_station();
}
return 0;
}
/*****************************
测试数据:P193算法导论(第二版)
6
2 4
7 8
2 2
9 5
3 1
3 6
1 2
4 4
3 2
8 5
4 1
4 7
3 2
****************************/
算法导论—动态规划之装配线调度
最新推荐文章于 2021-11-24 23:33:42 发布