算法第五章作业
1.#include
include
include
using namespace std;
const int MAXN = 30;
int n, m, d;
int c[MAXN][MAXN];
int w[MAXN][MAXN];
int min_weight;
int best_choice[MAXN];
int temp_choice[MAXN];
void backtrack(int k, int cur_cost, int cur_weight) {
if (k == n) {
if (cur_cost <= d && cur_weight < min_weight) {
min_weight = cur_weight;
memcpy(best_choice, temp_choice, sizeof(temp_choice));
}
return;
}
for (int j = 0; j < m; j++) {
int new_cost = cur_cost + c[k][j];
int new_weight = cur_weight + w[k][j];
if (new_cost > d || new_weight >= min_weight) {
continue;
}
temp_choice[k] = j;
backtrack(k + 1, new_cost, new_weight);
}
}
int main() {
cin >> n >> m >> d;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> c[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> w[i][j];
}
}
min_weight = INT_MAX;
memset(best_choice, -1, sizeof(best_choice));
memset(temp_choice, -1, sizeof(temp_choice));
backtrack(0, 0, 0);
cout << min_weight << endl;
for (int i = 0; i < n; i++) {
if (i > 0) cout << " ";
cout << best_choice[i] + 1;
}
cout << endl;
return 0;
}
代码采用回溯法求解最小重量机器设计问题,先定义全局变量存储部件 / 供应商数量、成本上限及成本 / 重量矩阵,通过回溯函数按部件索引递归遍历各供应商,结合成本超上限、重量非最优的剪枝策略筛选有效分支,递归至所有部件选完时更新最小重量和最优采购方案;主函数读取输入并初始化变量后调用回溯,最终输出最小重量及从 1 开始编号的各部件对应供应商。
1.1 最小重量机器设计问题的解空间是所有合法采购方案的集合.
1.2 最小重量机器设计问题的解空间树是一棵深度为 n(部件数)的 m 叉树.
1.3 有四类,1前处理的部件索引(k),2累计总成本,3累计总重量,4已选供应商的决策序列.
2.我理解的核心就三点,走一步,记一步:探险家从森林起点(根节点)出发,第一个岔路口(第 1 个部件)选一条路(某个供应商),就在笔记本上记:“现在走到第 1 个部件,花了 X 成本,背了 Y 重量,选的是第 j 个供应商”;走到下一个岔路口(第 2 个部件),再更新笔记本。这些记下来的内容,就是每个节点的状态,不用回头重新算,这是回溯能 “试错” 的基础。走不通,退一步:如果选某个供应商后,成本超了预算(死胡同),探险家不会硬闯,而是退回到上一个岔路口,擦掉笔记本上这一步的记录,换另一条路(下一个供应商)继续走。这和我之前写的嵌套循环穷举不一样 —— 嵌套循环要是部件数变了,代码就得重写,而回溯用递归自动处理 “退一步”,不管多少个部件,逻辑都不用改,特别灵活。看到死路就绕开:刚开始我以为 “穷举就得全走一遍”,但回溯的 “剪枝” 让我发现,探险家不用傻走:比如选某个供应商后,总重量已经比之前找到的 “最轻的路” 还重了,哪怕后面的路都合规,也不可能更优,直接放弃这条分支,掉头换路。这就像走路时看到路牌写 “此路到终点更重”,就不用再走了,能少走好多冤枉路。说白了,回溯不是 “瞎试”,是 “有策略的试错”:用递归代替多层循环,用状态记录避免重复计算,用剪枝减少无效尝试,最终在一堆可能的 “采购方案” 里,找到那个最轻的、成本又不超的答案。哪怕我现在写代码还会忘剪枝、忘记录状态,但越写越觉得,它就是把复杂的 “穷举” 变得有章法,不用怕试错,因为错了能退,还能少试很多错。

浙公网安备 33010602011771号