第五章算法上机报告

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 即遍历到了叶子结点。回溯算法穷举了所有可能的解,其时间复杂度通常是指数级别,但可以通过限界函数以及约束函数是当地降低复杂度,优化回溯算法。但其时间复杂度仍然很高,有时我们可以考虑别的算法,如皇后问题中就可以不使用回溯法求解。回溯法应用广泛,数独、下棋、迷宫等都可以用到回溯法,所以我们需要掌握好回溯法。

posted @ 2021-12-13 23:53  mooonquakes  阅读(36)  评论(0编辑  收藏  举报