当前位置:嗨网首页>书籍在线阅读

40-实战演练

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.6.5 实战演练

//program 5-5
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int MX=10000+5;
int n,bestf,f1,f2;//f1表示当前第一台机器上加工的完成时间,f2表示当前第二台机器上加工的完成时间
int x[MX],bestx[MX];
struct node
{
    int x,y;//机器零件在第一台机器上的加工时间x和第二台机器上的加工时间y
}T[MX];
void Backtrack(int t)
{
     if(t>n)
     {
          for(int i=1;i<=n;i++)    //记录最优排列
              bestx[i]=x[i] ;
          bestf=f2;                //更新最优值
          return ;
     }
     for(int i=t;i<=n;i++)         // 枚举
     {
          f1+=T[x[i]].x;
          int temp=f2;
          f2=max(f1,f2)+T[x[i]].y;
          if(f2<bestf)            //限界条件
          {
               swap(x[t] ,x[i]);  // 交换
               Backtrack(t+1);    // 继续深搜
               swap(x[t],x[i]);   // 复位,反操作
          }
          f1-=T[x[i]].x ;
          f2=temp ;
     }
}
int main()
{
     cout<<"请输入机器零件的个数n:";
     cin>>n;
     cout<<"请依次输入每个机器零件在第一台机器上的加工时间x和第二台机器上的加工时间y:";
     for(int i=1;i<=n;i++)
     {
          cin>>T[i].x>>T[i].y;
          x[i]=i;
     }
     bestf=INF;                   // 初始化
     f1=f2=0;
     memset(bestx,0,sizeof(bestx));
     Backtrack(1);                // 深搜排列树
     cout<<"最优的机器零件加工顺序为:";
     for(int i=1;i<=n;i++)        //输出最优加工顺序
         cout<<bestx[i]<<" ";
     cout<<endl;
     cout<<"最优的机器零件加工的时间为:";
     cout<<bestf<<endl;
     return 0 ;
}

算法实现和测试

(1)运行环境

Code::Blocks

(2)输入

请输入机器零件的个数n:6
请输入每个机器零件在第一台机器上的加工时间x和第二台机器上的加工时间y:
5 7
1 2
8 2
5 4
3 7
4 4

(3)输出

最优的机器零件加工顺序为:2 5 4 1 6 3
最优的机器零件加工的时间为:28