算法第五章作业

  1. 最小重量机器设计问题的回溯法分析
    问题要求从m个供应商中为n个部件各选一个,使总价格不超过d且总重量最小。
    1.1解空间:所有可能的供应商选择组合,共m的n次方种。
    1.2解空间树:m叉树,深度为n,每个节点代表一个部件的供应商选择,叶子节点代表完整方案。
    1.3遍历时,节点状态包括:
    当前累计价格cc:已选部件的总价格
    当前累计重量cw:已选部件的总重量
    当前选择路径cs:已为前p-1个部件选择的供应商序列
    当前最小重量minw:全局变量,记录当前找到的满足价格约束的最小重量

  2. 对回溯算法的理解
    回溯算法是一种系统搜索解空间的方法,通过深度优先遍历解空间树,逐步构建候选解。当到达叶子节点或发现当前路径不可行时,算法撤销最近的选择,尝试其他可能性。

我的代码:

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;

}

posted @ 2025-12-20 20:14  登基了但是不想上早朝  阅读(0)  评论(0)    收藏  举报