回溯法解工作分配问题

Jocelynn / 2023-05-03 / 原文

#include<iostream>
using namespace std;
int a[100][100], sum = 0, minn = 2147483647, i, j, n;
int b[100];
void dfs(int dep)
{
    int r;
    for (r = 1; r <= n; ++r)//dep表示第几个人,r表示工作
        if (!b[r]) //如果第r件工作没有被选择
        {
            b[r] = 1;
            sum += a[dep][r];//a[dep][r]表示第dep个人做第r个工作的费用
            if (dep == n && sum < minn) //递归出口,如果当前代价更小,进行更新
            {
                minn = sum;
            }
            if (dep != n)
            {
                if (sum < minn)//sum小于min,继续遍历该结点一下部分,否则剪枝(不进行这种分配)
                    dfs(dep + 1);
            }
            sum -= a[dep][r];//回溯一步
            b[r] = 0;
        }
}
int main()
{
    cin >> n; //工作数
    for (i = 1; i <= n; ++i)
        for (j = 1; j <= n; ++j)
            cin >> a[i][j];
    dfs(1);
    cout << minn << endl;
    return 0;
}