1. 请用回溯法的方法分析“最小重量机器设计问题”

7-2 最小重量机器设计问题 (25 分)
 

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。

输入格式:

第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行n个数。前n行是c,后n行是w。

输出格式:

输出计算出的最小重量,以及每个部件的供应商

代码:

#include<iostream>

int n,m,d;

int cc,cw, bc,bw=10000;
int array[1000],best_array[1000];
int c[1000][1000];
int w[1000][1000];
using namespace std;
void backtrack(int t)
{
if(t>n){
if(cw<bw){
bw=cw;
for(int i=1;i<=n;i++){
best_array[i]=array[i];
    }
}
return;
}
{
for(int i=1;i<=m;i++){
cw+=w[t][i];
cc+=c[t][i];
array[t]=i;
if(cw<bw && cc<=d){
backtrack(t+1);
}
cw-=w[t][i];
cc-=c[t][i];
array[t]=0;
        }
    }
 }
int main()
{
int i,j;
cin>>n>>m>>d;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
cin>>c[i][j];
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
cin>>w[i][j];
}
backtrack(1);
cout<<bw<<endl;
for(int i=1;i<=n;i++)
{
cout<<best_array[i]<<" ";
}
cout<<endl;
return 0;
}

算法分析:先构建一棵解空间树,从1到m层进行深度优先搜索,遇到不符合约束函数时,剪枝后回溯,向另一个活结点进行深度优先搜索,直到叶节点,同时更新记录的最优解。当比较完所有叶节点累计的价值时,找到最优解。

限制条件:当前累计重量小于最小重量。约束条件:总价格不超过d。

1.1 说明“最小重量机器设计问题"的解空间

所有长度为n的各供应商组合向量的集合。

1.2 说明 “最小重量机器设计问题"的解空间树

 

 

1.3 在遍历解空间树的过程中,每个结点的状态值是什么

当前累计的重量和价值。

2. 你对回溯算法的理解

 回溯法是一种基于深度优先方式搜索的算法,从根节点出发,纵向搜索扩展结点,当该结点不能再向纵深方向移动时,回溯到上一个活结点,重复操作,直至找到所求的解。该算法由于要查找所有可能性,所以时间复杂度较高。应配合使用剪枝函数,提高算法的效率。