算法第五章作业
-
最小重量机器设计问题的回溯法分析
问题要求从m个供应商中为n个部件各选一个,使总价格不超过d且总重量最小。
1.1解空间:所有可能的供应商选择组合,共m的n次方种。
1.2解空间树:m叉树,深度为n,每个节点代表一个部件的供应商选择,叶子节点代表完整方案。
1.3遍历时,节点状态包括:
当前累计价格cc:已选部件的总价格
当前累计重量cw:已选部件的总重量
当前选择路径cs:已为前p-1个部件选择的供应商序列
当前最小重量minw:全局变量,记录当前找到的满足价格约束的最小重量 -
对回溯算法的理解
回溯算法是一种系统搜索解空间的方法,通过深度优先遍历解空间树,逐步构建候选解。当到达叶子节点或发现当前路径不可行时,算法撤销最近的选择,尝试其他可能性。
我的代码:
include
using namespace std;
int n, m, d;
int c[31][31];
int w[31][31];
int cs[31];
int bs[31];
int cc = 0;
int cw = 0;
int minw = 0x3f3f3f;
void backtrack(int p){
if(p > n){
if(cw < minw){
minw = cw;
for(int i=1;i<=n;i++){
bs[i] = cs[i];
}
}
return;
}
for(int j=1;j<=m;j++){
if(cc + c[p][j] <=d){
int lc = cc;
int lw = cw;
cs[p] = j;
cc += c[p][j];
cw += w[p][j];
if(cw < minw){
backtrack(p+1);
}
cc = lc;
cw = lw;
}
}
}
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 << minw << endl;
for(int i=1;i<=n;i++){
cout << bs[i] << " ";
}
return 0;
}
浙公网安备 33010602011771号