回溯法解工作分配问题
#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; }