Loading docs/search/opt.md +62 −64 Original line number Diff line number Diff line Loading @@ -97,7 +97,6 @@ void dfs(传入数值) { ??? note "工作分配问题" **题目描述** ``` 有 $n$ 份工作要分配给 $n$ 个人来完成,每个人完成一份。第 $i$ 个人完成第 $k$ 份工作所用的时间为一个正整数 $t_{ik}$,其中 $1 \leq i, k \leq n$。试确定一个分配方案,使得完成这 $n$ 份工作的时间总和最小。 输入包含 $n + 1$ 行。 Loading Loading @@ -130,7 +129,6 @@ $1 \leq t_{ik} \leq 10^4$ ```text 5 ``` ``` **分析** Loading @@ -146,7 +144,8 @@ int time[N][N];// 完成某项工作所需的时间 int cost_time_total_min; // 完成 n 份工作的最小时间总和 // i 表示第几个人,count 表示工作费用总和 inline void work(int i, int count, int n) { // 如果 i 超出了所能分配的最大工作件数,表示分配完成,并且 count 比原来 cost_time_total_min 花费少 则更新 cost_time_total_min 的值 // 如果 i 超出了所能分配的最大工作件数,表示分配完成,并且 count 比原来 // cost_time_total_min 花费少 则更新 cost_time_total_min 的值 if (i > n && count < cost_time_total_min) { cost_time_total_min = count; return; Loading @@ -161,14 +160,14 @@ inline void work(int i, int count, int n){ isWorked[j] = 1; //工作交给第 i + 1 个人 work(i + 1, count + time[i][j], n); //在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配,将 isWorked[j] 重设为 0 //在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配,将 //isWorked[j] 重设为 0 isWorked[j] = 0; } } } } int main(int argc, char const *argv[]) { int main(int argc, char const *argv[]) { setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20); setvbuf(stdout, new char[1 << 20], _IOFBF, 1 << 20); int n; Loading @@ -184,4 +183,3 @@ int main(int argc, char const *argv[]) return 0; } ``` Loading
docs/search/opt.md +62 −64 Original line number Diff line number Diff line Loading @@ -97,7 +97,6 @@ void dfs(传入数值) { ??? note "工作分配问题" **题目描述** ``` 有 $n$ 份工作要分配给 $n$ 个人来完成,每个人完成一份。第 $i$ 个人完成第 $k$ 份工作所用的时间为一个正整数 $t_{ik}$,其中 $1 \leq i, k \leq n$。试确定一个分配方案,使得完成这 $n$ 份工作的时间总和最小。 输入包含 $n + 1$ 行。 Loading Loading @@ -130,7 +129,6 @@ $1 \leq t_{ik} \leq 10^4$ ```text 5 ``` ``` **分析** Loading @@ -146,7 +144,8 @@ int time[N][N];// 完成某项工作所需的时间 int cost_time_total_min; // 完成 n 份工作的最小时间总和 // i 表示第几个人,count 表示工作费用总和 inline void work(int i, int count, int n) { // 如果 i 超出了所能分配的最大工作件数,表示分配完成,并且 count 比原来 cost_time_total_min 花费少 则更新 cost_time_total_min 的值 // 如果 i 超出了所能分配的最大工作件数,表示分配完成,并且 count 比原来 // cost_time_total_min 花费少 则更新 cost_time_total_min 的值 if (i > n && count < cost_time_total_min) { cost_time_total_min = count; return; Loading @@ -161,14 +160,14 @@ inline void work(int i, int count, int n){ isWorked[j] = 1; //工作交给第 i + 1 个人 work(i + 1, count + time[i][j], n); //在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配,将 isWorked[j] 重设为 0 //在一轮迭代完成之后,返回到上一个人,要对此次的工作进行重新分配,将 //isWorked[j] 重设为 0 isWorked[j] = 0; } } } } int main(int argc, char const *argv[]) { int main(int argc, char const *argv[]) { setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20); setvbuf(stdout, new char[1 << 20], _IOFBF, 1 << 20); int n; Loading @@ -184,4 +183,3 @@ int main(int argc, char const *argv[]) return 0; } ```