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了。第二题和结队队友思考了一下就找到了解空间,后面思考如何剪枝的时候想得太复杂了所以把自己绕了进去,后面发现其实没有自己想得那么复杂,很快就解了出来。回溯法真的很万能!