算法第五章作业

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

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

每个部件都有m种选择,当我们要做的就是把每种情况都穷举出来构建解空间,当然我们会遇到不满题目条件的情况(总重量大于d),这个时候我们就要利用回溯法。最后在问题的解空间寻找问题的一个(最优)解。

代码:

#include<bits/stdc++.h>
using namespace std;
int n, m, d;
int c[1000][1000], w[1000][1000];
int x[1000];
int p[1000];
int cw = 0, cc = 0, wmin = 1e9;
void backtrack(int t) {
    if(t > n) {
        wmin = cw;
        for(int i = 1; i <= n; i++) {
            p[i] = x[i];
        }
        return;
    }
    for(int i = 1; i <= m; i++) {
        if(cc + c[t][i] <= d && cw + w[t][i] < wmin) {
            x[t] = i;
            cw += w[t][i];
            cc += c[t][i];
            backtrack(t + 1);
            cw -= w[t][i];
            cc -= c[t][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 << wmin << endl;
    for(int i = 1; i <= n; i++) {
        cout << p[i] << " ";
    }
    return 0;
}

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

按照题目的案例,解空间如下

{{1,3,1},{1,3,2},{1,3,3}}

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

列举第一个解空间元素对应的解空间树

 

当前问题的解空间树应为所有满足题设条件的供应商所构成的树。

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

每个结点的状态值应该是当前的总价值cv和总重量cw

2. 你对回溯算法的理解

回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为"回溯点"

 

posted @ 2021-12-11 10:26  固执不是故事  阅读(19)  评论(0编辑  收藏  举报