题目描述
有两条装配线,编号分别为1和2。每一条装配线上有个n装配点,将第i条线上的第个j装配点记为Si,j,设在装配点Si,j的装配时间为Ai,j。假设要装配一辆汽车,将汽车底盘从进厂点送入第i号装配线,需要时间Ei。在装配点Si,j装配后,如果汽车传送到同一号装配线的装配点Si,j+1进行装配,则传送不需要时间。如果汽车完成装配点Si,j的工作后传送到另一号装配线进行下一步的工作,则需要传送时间Ti,j。汽车在装配点Si,n装配后,将汽车成品从装配线上退下来,需要花费时间Xi。装配线调度问题是如何确定每一个装配点的装配需要在哪号线上进行,使得当汽车成品出来时,花费的总时间最少。
输入
输入的第一行包含一个正整数n(1<=n<=1000)
第二行包含四个正整数,分别是传入装配线所用时间E1,E2和退出装配线所用时间X1,X2。(0<E1,E2,X1,X2<=1000)
接下来的两行每行有n个正整数,分别描述装配时间A1,j和A2,j(0<Ai,j<=1000)(1<=j<=n)。
接下来的两行每行有n - 1个正整数,分别描述传送时间T1,j和T2,j(0<=Ti,j<=150)(1<=j<=n-1)。
输出
输出一个正整数表示一辆汽车最快需要多少时间出厂。
样例输入
4
10 20 40 30
50 100 1000 50
200 200 200 65
10 10 10
20 20 20
样例输出
465
#include
#include
using namespace std;
const int N=1000;
int f1[N], f2[N], l1[N], l2[N], f, l; //f数组存放当前子问题最快装配问题,l数组存放子问题前一点的装配线
void DPFastestWay(int a1[], int a2[], int t1[], int t2[], int e1, int e2, int x1, int x2, int n)
{
f1[1]=e1+a1[1];
f2[1]=e2+a2[1];
for(int j=2; j<=n; j++)
{
if(f1[j-1]+a1[j]<=f2[j-1]+t2[j-1]+a1[j])
{
f1[j]=f1[j-1]+a1[j];
l1[j]=1;
}
else
{
f1[j]=f2[j-1]+t2[j-1]+a1[j];
l1[j]=2;
}
if(f2[j-1]+a2[j]<=f1[j-1]+t1[j-1]+a2[j])
{
f2[j]=f2[j-1]+a2[j];
l2[j]=2;
}
else
{
f2[j]=f1[j-1]+t1[j-1]+a2[j];
l2[j]=1;
}
}
if(f1[n]+x1<=f2[n]+x2)
{
f=f1[n]+x1;
l=1;
}
else
{
f=f2[n]+x2;
l=2;
}
}
void PrintStation(int l1[], int l2[],int l, int n) //打印路线
{
int i=l;
cout<<"line "<
<<", statioin "<
<
1; j--) { if(i==1) { i=l1[j]; cout<<"line "<
<<", station "<
<