#include <iostream>
using namespace std;
int n,m,d;
int w[40][40];//重量
int c[40][40];//价格
int bestx[40];//最优解
int x[40];//当前解
int cw=0,cc=0,mw=9999999;//当前重量 当前价格 当前解
void Backtrack(int depth){
if(depth>n){//找到根节点
if(cw<mw){//当前值小于最小值
for(int i=1;i<=n;i++)
bestx[i]=x[i];
mw=cw;
}
return;
}
for(int i=1;i<=m;i++){ //m个商店对应n层分叉树
x[depth]=i;
cc+=c[depth][i];
cw+=w[depth][i];
if(cc<=d&&cw<mw){// 当前价格小于最优价格 当前重量小于最优重量
Backtrack(depth+1);
}
x[depth]=0;//回溯 更新信息
cc-=c[depth][i];
cw-=w[depth][i];
}
}
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];
}
}
Backtrack(1);
cout<<mw<<endl;
for(int i=1;i<=n;i++){
cout<<bestx[i]<<" ";
}
return 0;
}
1.1 说明“最小重量机器设计问题"的解空间
对于每一种部件,都有不同的供应商进行选择,而每一个供应商都有对应的重量w和价格c。
1.2 说明 “最小重量机器设计问题"的解空间树
1.3 在遍历解空间树的过程中,每个结点的状态值是什么
2. 你对回溯算法的理解
我理解的回溯法,主要用的是深度优先遍历,它把问题的解空间转化成了图或者树的结构表示。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否能得到问题的解。如果不可行,则跳过以该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。