算法第五章实验报告

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

定义x[N],c[N][N],w[N][N]数组分别表示选择的部件,所选择的部件的价格与重量。定义并初始化变量cp=0,cw=0,bestw=1e9分别表示当前遍历的价格总和与重量总和,以及当前记录的最小重量。在遍历的过程中未达到叶子结点准备继续向下遍历时先进行判断,判断是否符合约束条件,符合则继续向下遍历,不符合则回溯到上一层,状态也进行更新。当遍历到叶子结点时,将当前计算的重量总和与记录最小重量进行比较,小于则更新最小重量。

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

根据题目可知解空间即为每个部件选择的供应商,解空间的长度为n向量组成,每个供应商可有m个部件选择。那么解空间为m^n。

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

树的层数代表第几个部件,每个结点有三个分支,代表三个供应商。

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

#include<iostream>//类似于0-1背包问题 选或不选
#include<cmath>
using namespace std;

const int N=1000;
int n,m,d,x[N],x1[N],c[N][N],w[N][N];//c为价格 w为重量
int cp=0,cw=0,bestw=1e9;//cp当前的价格 cw当前的重量

void backtract(int t)
{
if(t>n)//已经到达叶子结点某个深度遍历完成
{
if(cw<bestw)
{
bestw=cw;
for(int i=1;i<=n;i++)
{
x1[i] = x[i];//题目中有个陷阱第三个商家的价格重量一样没有这一部那么则会将2和3输出因为2和3也符合条件,但题目
//要求只输出1,所以这个条件就是第一个符合的放入新数组中,如果后面有与前面相同的
}
}
return;
}
else
{
for(int j=1;j<=n;j++)//第t个材料所选择的 第j个商家
{
cp += c[t][j];
cw += w[t][j];
x[t] = j;
if(cp <= d&&cw <= bestw)
{
backtract(t+1);
}//符合条件则继续向下遍历 否则退出 回溯 结点状态更新回父结点
cp -= c[t][j];
cw -= c[t][j];
}
}
}

int main()
{
cin >> n >> m >> d;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin >> c[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin >> w[i][j];
}
backtract(1);
cout << bestw <<endl;
for(int i=1;i<=n;i++)
{
cout << x1[i] <<" ";
}
return 0;
}

2. 你对回溯算法的理解

利用树的数据结构,进行深度遍历,在遍历过程中利用约束函数以及限界函数进行剪支,以此来减少可遍历的结点数达到提高效率的目的。

posted @ 2021-12-17 00:15  啦啦。。。  阅读(11)  评论(0编辑  收藏  举报