最优加工顺序之回溯法
代码实现
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
#define MAX 9999
int n;
int T1[MAX];
int T2[MAX];
int tempChoose[MAX];
int bestChoose[MAX];
int bestLast;
int last1,last2;
void Backtrack(int t);
int main(void){
cout<<"请输入机器零件的个数\n";
cin>>n;
cout<<"请输入每个机器零件需要的第一台机器加工时间与第二台机器加工时间\n";
for(int i=0;i<n;i++){
cin>>T1[i];
cin>>T2[i];
tempChoose[i]=i;
}
bestLast=INF;
last1=last2=0;
for(int i=0;i<n;i++){
bestChoose[i]=0;
}
Backtrack(0);
cout<<"最优加工顺序\n";
for(int i=0;i<n;i++){
cout<<bestChoose[i]<<" ";
}
cout<<endl;
cout<<"最优的机器零件加工的时间为\n";
cout<<bestLast<<endl;
return 0;
}
void Backtrack(int t){
if(t>=n){
for(int i=0;i<n;i++){
bestChoose[i]=tempChoose[i];
}
bestLast=last2;
return;
}
for(int i=t;i<n;i++){
last1+=T1[tempChoose[i]];
int temp=last2;
last2=max(last1,last2)+T2[tempChoose[i]];
if(last2<bestLast){
swap(tempChoose[t],tempChoose[i]);
Backtrack(t+1);
swap(tempChoose[t],tempChoose[i]);
}
last1-=T1[tempChoose[i]];
last2=temp;
}
}
样例
pi@raspberrypi:/media/pi/DIST/Algorithm/第五章 回溯法/00004H_最优加工顺序 $ ./code
请输入机器零件的个数
7
请输入每个机器零件需要的第一台机器加工时间与第二台机器加工时间
3 7
8 2
10 6
12 18
6 3
9 10
15 4
最优加工顺序
0 2 3 4 5 6 1
最优的机器零件加工的时间为
65