算法第五章上机实践报告

一 . 实践题目

7-2 工作分配问题

二 . 问题描述

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

输入格式:

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

输出格式:

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

输入样例:

3
10 2 3
2 3 4
3 4 5

输出样例:

9

三 . 算法描述

1. 解空间

第一个人选择第几个工作,第二个人选择第几个工作,第三个人选择第几个工作......

这道题是一个排列数问题

2.解空间树

3.约束函数

cc:当前总费用

bestc:当前最佳费用

if (cc+a[i][x[j]]<bestc){
            cc+=a[i][x[j]];
            swap(x[i], x[j]);
            Backtrack(i+1);
            swap(x[i], x[j]);
            cc-=a[i][x[j]]; 
  }

4.核心代码

void Backtrack (int i)
{
  if (i>n){
      if(cc < bestc){
          bestc = cc;
      }
      return;
  } 
  else{
      for (int j=i;j<=n;j++) {
        if (cc+a[i][x[j]]<bestc){
            cc+=a[i][x[j]];
            swap(x[i], x[j]);
            Backtrack(i+1);
            swap(x[i], x[j]);
            cc-=a[i][x[j]];  
        }
    }
   }
}

 

四 . 心得体会

我和同伴一开始对于回溯法的理解都不够,实验课的时候我们做第一题但是一直过不了,没有来得及看第二题。

课后做了第二题,对回溯法有了进一步的理解,但是我们现在做题还是依赖于去套框架,还需要加强理解。

posted @ 2018-12-22 19:57  Ygrittee  阅读(198)  评论(0编辑  收藏  举报