装配线调度问题

题目描述

  有两条装配线,编号分别为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 "< 
          
            < 
            

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值