问题描述:假设有n个任务需要分配给n个人执行,每个任务只分配给一个人,每个人只分配一个任务,且第j个任务分配给第i个人的成本是C[i, j](1≤i , j≤n),任务分配问题要求找出总成本最小的分配方案。
可以用一个 n 元组(j1, j2, …, jn)来描述任务分配问题的一个可能解,其中第 i 个分量ji(1≤i≤n)表示在第 i 行中选择的列号,因此用蛮力法解决任务分配问题要求生成整数1~n的全排列,然后把成本矩阵中相应元素相加来求得每种分配方案的总成本,最后选出具有最小和的方案。
代码实现:
#include <iostream>
#include <cstring>
using namespace std;
int visit[11],num[11];
int n,value = 9999999;
int martrix[4][4];
void findLowValue()
{
int sum = 0;
for(int i = 1;i <= n;i++)
{
sum += martrix[i - 1][num[i] - 1];
}
if(sum < value)
{
value = sum;
}
}
void dfs(int length)
{
if(length > n)
{
findLowValue();
}
else
{
for(int i = 1;i <= n;i++)
{
if(visit[i] == 0)
{
visit[i] = 1;
num[length] = i;
dfs(length + 1);
visit[i] = 0;
}
}
}
}
int main()
{
cin >> n;
memset(visit,0,sizeof(visit));
for(int i = 0;i < 4;i++)
{
for(int j = 0;j < 4;j++)
{
cin >> martrix[i][j];
}
}
dfs(1);
cout << "minValue:" <<value;
return 0;
}