最小重量机器设计问题:设某一机器由N个部件组成,每一个部件都可以从M个不同的供应商处购得。设wij是从供应商j处购得部件i的重量,cij是相应的价格。试设计一个算法,给出总价格不超过C的最小重量机器设计。
(用C++写,算法为回溯法,数据输入法为手工输入)
1 #include<iostream> 2 using namespace std; 3 #define N 50 4 class MinWmechine 5 { 6 int n; //部件个数 7 int m; //供应商个数 8 int COST; //题目中的C 9 int cw; //当前的重量 10 int cc; //当前花费 11 int bestw; //当前最小重量 12 int bestx[N]; 13 int savex[N]; 14 int w[N][N]; 15 int c[N][N]; 16 public: 17 MinWmechine(); 18 void machine_plan(int i); 19 void prinout(); 20 }; 21 MinWmechine::MinWmechine() 22 { 23 cw=0; //当前的重量 24 cc=0; //当前花费 25 bestw=-1; //当前最小重量 26 bestx[N]; 27 savex[N]; 28 cout<<"请输入部件个数:"; 29 cin>>n; 30 cout<<"请输入供应商个数:"; 31 cin>>m; 32 cout<<"请输入总价格不超过:"; 33 cin>>COST; 34 for(int j=0;j<m;j++) 35 { 36 for(int i=0;i<n;i++) 37 { 38 cout<<"请输入第 "<<j+1<<" 个供应商的第 "<<i+1<<" 个部件的重量:"; 39 cin>>w[i][j]; 40 cout<<"请输入第 "<<j+1<<" 个供应商的第 "<<i+1<<" 个部件的价格:"; 41 cin>>c[i][j]; 42 if(w[i][j]<0 || c[i][j]<0) 43 { 44 cout<<"重量或价钱不能为负数!\n"; 45 i=i-1; 46 } 47 } 48 } 49 } 50 void MinWmechine::machine_plan(int i) 51 { 52 if(i>=n) 53 { 54 if(cw <bestw || bestw==-1) 55 { 56 bestw=cw; 57 for(int j=0;j<n; j++) //把当前搜过的路径记下来 58 savex[j]=bestx[j]; 59 } 60 return; 61 } 62 for(int j=0; j<m; j++) //依次递归尝试每个供应商 63 { 64 if(cc+c[i][j]<COST) 65 { 66 cc+=c[i][j]; 67 cw+=w[i][j]; 68 bestx[i]=j; 69 machine_plan(i+1); 70 bestx[i]=-1; 71 cc-=c[i][j]; 72 cw-=w[i][j]; 73 } 74 } 75 } 76 void MinWmechine::prinout() 77 { 78 int i,j,ccc=0; 79 for(j=0;j<m;j++) 80 { 81 for(i=0;i<n;i++) 82 { 83 cout<<"第 "<<j+1<<" 供应商的第 "<<i+1<<" 部件重量:"<<w[i][j]<<" 价格:"<<c[i][j]<<"\n"; 84 } 85 } 86 for(j=0; j<n; j++) 87 { 88 bestx[j]=-1; 89 } 90 machine_plan(0); 91 cout<<"\n最小重量机器的重量是: "<<bestw<<endl; 92 for(int k=0; k<n; k++) 93 { 94 cout<<" 第 "<<k+1<<" 部件来自供应商 "<<savex[k]+1<<"\n"; 95 ccc+=c[k][savex[k]]; 96 } 97 cout<<"\n该机器的总价钱是: "<<ccc<<endl; 98 cout<<endl; 99 } 100 int main(void) 101 { 102 MinWmechine Y; 103 Y.prinout(); 104 return 0; 105 }