第五章算法上机报告
1. 请用回溯法的方法分析“最小重量机器设计问题”
7-2 最小重量机器设计问题 (25 分)
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。
输入格式:
第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行m个数。前n行是c,后n行是w。
输出格式:
输出计算出的最小重量,以及每个部件的供应商
输入样例:
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
结尾无空行
输出样例:
在这里给出相应的输出。例如:
4
1 3 1
1.1 说明“最小重量机器设计问题"的解空间
解空间是每个部件所选择的供应商
1.2 说明 “最小重量机器设计问题"的解空间树
1.3 在遍历解空间树的过程中,每个结点的状态值是什么
每个结点的状态值:
cv:当前总价值
cw:当前总重量
1.4 代码
1 #include <iostream> 2 using namespace std; 3 int n; //部件数量 4 int m; //供应商 5 int d; //限制价格 6 int c[100][100]; //价值 7 int w[100][100]; //重量 8 int cv;// 当前价值 9 int cw; 10 int x[100]; 11 int result[100]; 12 int minm=10000; 13 void Backtrack(int t){ 14 if(t>n){ 15 if(cw<minm){ 16 minm=cw; 17 for(int i=1;i<=n;i++){ 18 result[i]=x[i]; 19 } 20 } 21 } 22 else{ 23 for(int i=1;i<=m;i++){ 24 x[t]=i; 25 cv+=c[t][i]; 26 cw+=w[t][i]; 27 if(cv<=d&&cw<minm){ 28 Backtrack(t+1); 29 } 30 cv-=c[t][i]; 31 cw-=w[t][i]; 32 33 34 } 35 } 36 } 37 int main(){ 38 cin>>n>>m>>d; 39 for(int i=1;i<=n;i++){ 40 for(int j=1;j<=m;j++){ 41 cin>>c[i][j]; 42 } 43 } 44 for(int i=1;i<=n;i++){ 45 for(int j=1;j<=m;j++){ 46 cin>>w[i][j]; 47 } 48 } 49 cw=0; 50 cv=0; 51 Backtrack(1); 52 cout<<minm<<endl; 53 for(int i=1;i<=n;i++){ 54 cout<<result[i]<<" "; 55 } 56 }
2. 你对回溯算法的理解
回溯算法,采用深度优先遍历每一个结点,边界条件为 n>t 即遍历到了叶子结点。回溯算法穷举了所有可能的解,其时间复杂度通常是指数级别,但可以通过限界函数以及约束函数是当地降低复杂度,优化回溯算法。但其时间复杂度仍然很高,有时我们可以考虑别的算法,如皇后问题中就可以不使用回溯法求解。回溯法应用广泛,数独、下棋、迷宫等都可以用到回溯法,所以我们需要掌握好回溯法。