dp:流水作业调度问题

来源:互联网 发布:淘宝客服服务流程图 编辑:程序博客网 时间:2024/05/17 00:57
#include <iostream>using namespace std;struct Task{ //定义一个任务结构体,装的是任务号,在M1和M2上所需要的时间    int id;    int time_M1;    int time_M2;};void FlowShop(struct Task t[],int *x,int n,int &time)//参数分别是一个结构体数组,x返回任务的执行顺序的id,n为任务个数,time返回总时间,这里time为C++里面的引用类型{    struct Task N1[20],N2[20],temp;//N1,N2分别装time_M1[i]<time_M2[i]和a[i]>b[i]的,temp是用于冒泡排序交换的临时变量    int k1,k2;//k1总表示当前M1上执行的总时间    int ii,jj;//k1总表示当前M2上执行的总时间    ii=jj=0;//分别用于N1,N2两个集合下标的计数器    /*对满足time_M1[i]<time_M2[i]的任务装到N1中,满足time_M1[i]>time_M2[i]的任务装到N2中*/    for(int i=0;i<n;i++)        if(t[i].time_M1<t[i].time_M2)            N1[ii++]=t[i];        else            N2[jj++]=t[i];    /*对N1中的任务按time_M1非递减排序*/    for(int i=0;i<ii-1;i++)        for(int j=i+1;j<ii;j++)            if(N1[i].time_M1>N1[j].time_M1)            {                temp=N1[i];                N1[i]=N1[j];                N1[j]=temp;            }    /*对N2中的任务按time_M2非递增排序*/    for(int i=0;i<jj-1;i++)        for(int j=i+1;j<jj;j++)            if(N2[i].time_M2<N2[j].time_M2)            {                temp=N2[i];                N2[i]=N2[j];                N2[j]=temp;            }    jj=0;//jj初始化为0,方便后面对x[i]进行赋值    for(int i=0;i<ii;i++)//把N1的任务挨个儿放进去        x[i]=N1[i].id;    for(int i=ii;i<n;i++)//把N2的任务挨个儿放进去,jj在这里起计数器的作用        x[i]=N2[jj++].id;    /*初始化k1,k2,time*/    k1=t[x[0]-1].time_M1;//因为x[]数组里面装的是id,不是下标,因此要减去1才能当做结构体数组t的下标,下同    k2=k1+t[x[0]-1].time_M2;    time=k1+k2;    for(int i=1;i<n;i++)/*从第二个任务到第n个任务,这里是数组所以下标为1时就代表第二个任务啦*/    {        if(k1+t[x[i]-1].time_M1>k2)//如果第i个任务的time_M1加上已有的k1比下面的k2大,那么任务i在M2上面开始执行的时间应该是k1+t[x[i]-1].time_M1        {            k1+=t[x[i]-1].time_M1;            k2=t[x[i]-1].time_M2+k1;            time=k2;        }        else//如果第i个任务的time_M1加上已有的k1比下面的k2小,那么任务i在M2上面开始执行的时间应该是k2+t[x[i]-1].time_M1        {            k1+=t[x[i]-1].time_M1;            k2+=t[x[i]-1].time_M2;            time=k2;        }    }}int main(){    struct Task task[6]={{1,2,5},                         {2,7,3},                         {3,6,2},                         {4,4,7},                         {5,6,9},                         {6,8,2}                        };    int x[6],time=0;    FlowShop(task,x,6,time);    for(int i=0;i<6;i++)        cout<<x[i]<<" ";    cout<<endl;    cout<<"total time is:"<<time<<endl;}



原创粉丝点击