问题描述
假设有n个任务需要分配给n个人执行,每个任务只分配给一个人,每个人只分配一个任务,且第j个任务分配给第i个人的成本是C[i, j](1≤i , j≤n),任务分配问题要求找出总成本最小的分配方案。
蛮力法
思路:
通过递归遍历所有方案,找到成本最小的那个方案。
//分配问题:蛮力法
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxx 10000
using namespace std;
int n;//任务总数
int x[maxx][maxx];//员工完成某任务需要的成本
int visited[maxx];//标记任务是否被占用
int sum = 0;//完成所有任务需要的成本
int value = maxx;//完成所有任务需要的最小成本
int staff1[maxx];//标记员工的任务
int staff2[maxx];
int recursion(int s)//s表示第s位员工选择任务
{
if(s > n)//判断是否选择完毕
{
if(sum < value)
{
value = sum;//获取最小成本
for(int i=1;i<=n;i++)
{
staff2[i] = staff1[i];
}
}
return 0;
}
for(int i=1;i<=n;i++)
{
if(visited[i] != 0)
{
continue;
}
visited[i] = 1;
sum +=x[s][i];
staff1[s] = i;
recursion(s+1);
//回溯
visited[i] = 0;
sum -= x[s][i];
}
return 0;
}
int main()
{
cout << "请输入任务数量:";
cin >> n;
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("请输入第 %d 位员工做第 %d 号任务需要的成本大小:",i,j);
cin >> x[i][j];
}
}
recursion(1);
cout << "当成本最小时,员工所对应的任务依次为:";
for(int i=1;i<=n;i++)
{
cout << staff2[i] << " ";
}
cout << endl << "最小成本为:" << value << endl;
return 0;
}
运行结果如下;