【实践】第五章上机实践

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

转载于:https://www.cnblogs.com/orchids/p/10148767.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值