Loading docs/search/opt.md +14 −14 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ void dfs(传入数值) { 检查工作分配,其实就是判断取得可行解时的二维数组的第一维下标各不相同并且第二维下标各不相同。而我们是要得到完成这 $n$ 份工作的最小时间总和,即可行解中时间总和最小的一个,故需要再定义一个全局变量 `cost_time_total_min` 表示目前找到的解中最小的时间总和,初始 `cost_time_total_min` 为 `time[i][i]` 之和,即对角线工作时间相加之和。在所有人分配完工作时,比较 `count` 与 `cost_time_total_min` 的大小,如果 `count` 小于 `cost_time_total_min` ,说明找到了一个最优解,此时就把 `count` 赋给 `cost_time_total_min` 。 但考虑到算法的复杂度,这里还有一个剪枝优化的工作可以做。就是在每次计算局部费用变量 $count$ 的值时,如果判断 $count$ 已经大于 `cost_time_total_min` ,就没必要再往下分配了,因为这时得到的解必然不是最优解。 但考虑到算法的效率,这里还有一个剪枝优化的工作可以做。就是在每次计算局部费用变量 `count` 的值时,如果判断 `count` 已经大于 `cost_time_total_min` ,就没必要再往下分配了,因为这时得到的解必然不是最优解。 #### 经典例题代码 Loading Loading @@ -164,8 +164,8 @@ inline void work(int i, int count, int n) { is_working[j] = 1; // 工作交给第 i + 1 个人 work(i + 1, count + time[i][j], n); // 在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配,将 // is_working[j] 重设为 0 // 在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配 // 将 is_working[j] 重设为 0 is_working[j] = 0; } } Loading Loading
docs/search/opt.md +14 −14 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ void dfs(传入数值) { 检查工作分配,其实就是判断取得可行解时的二维数组的第一维下标各不相同并且第二维下标各不相同。而我们是要得到完成这 $n$ 份工作的最小时间总和,即可行解中时间总和最小的一个,故需要再定义一个全局变量 `cost_time_total_min` 表示目前找到的解中最小的时间总和,初始 `cost_time_total_min` 为 `time[i][i]` 之和,即对角线工作时间相加之和。在所有人分配完工作时,比较 `count` 与 `cost_time_total_min` 的大小,如果 `count` 小于 `cost_time_total_min` ,说明找到了一个最优解,此时就把 `count` 赋给 `cost_time_total_min` 。 但考虑到算法的复杂度,这里还有一个剪枝优化的工作可以做。就是在每次计算局部费用变量 $count$ 的值时,如果判断 $count$ 已经大于 `cost_time_total_min` ,就没必要再往下分配了,因为这时得到的解必然不是最优解。 但考虑到算法的效率,这里还有一个剪枝优化的工作可以做。就是在每次计算局部费用变量 `count` 的值时,如果判断 `count` 已经大于 `cost_time_total_min` ,就没必要再往下分配了,因为这时得到的解必然不是最优解。 #### 经典例题代码 Loading Loading @@ -164,8 +164,8 @@ inline void work(int i, int count, int n) { is_working[j] = 1; // 工作交给第 i + 1 个人 work(i + 1, count + time[i][j], n); // 在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配,将 // is_working[j] 重设为 0 // 在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配 // 将 is_working[j] 重设为 0 is_working[j] = 0; } } Loading