【实践】第五章上机实践

1、实践题目:工作分配问题

2、问题描述

设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。

输入:

输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。

输出:

将计算出的最小总费用输出到屏幕。

3、算法描述

解空间:

建一个二维数组c[i][j],用以表示将工作i分配给第j个人所需的费用。给定一个循环,从第1个工作开始循环分配工人,直到所有工作都分配到。为第i个工作分配工人时,检查该工人是否合适,合适则分配给该号工人,否则检查下一个工人。可以用一个一维数组x[j]来表示第j号工人是否被分配。使用排列树,其中level i 代表工作i,每一个节点引出剩余工人人数个branch。

解空间树:排列树

剪枝描述:

在每次计算局部费用变量cp的值时,如果判断cp已经大于mins,就没必要再往下分配了。

if(cp + w[t][x[i]] < mins)
          {
              cp += w[t][x[i]];
              sw(t, i);
              backtrack(t+1);
              sw(i, t);
              cp -= w[t][x[i]];
          }

4、心得体会

这次实践题的第一题和老师上课讲的o-1背包问题一样,只要先把物品都按照单位价值按降序排好,再严格一点地剪枝就能ac了。第二题和结队队友思考了一下就找到了解空间,后面思考如何剪枝的时候想得太复杂了所以把自己绕了进去,后面发现其实没有自己想得那么复杂,很快就解了出来。回溯法真的很万能!

猜你喜欢

转载自www.cnblogs.com/orchids/p/10148767.html
今日推荐