【问题描述】
假设有n个任务需要分配给n个人执行,每个人只执行一个任务,每个任务只由一个人执行。第i个人执行第j个任务的成本是Cij(1<=i,j<=n),
求解初最小成本的分配方案。
【基本算法思想】
暴力法:
用矩阵表示任务分配问题,矩阵元素Cij(1<=i,j<=n)表示人员i执行任务j的成本。任务分配问题转化为,在矩阵中的每一行选取一个元素,这些元素
分别属于不同的列。用一个n元组(j1,j2,...,jn)表示一个可能解,其中ji表示第i行中选择的列号。用暴力法解决此问题则可表示成,生成一个
n元组的全排列,遍历输出最小的成本代价即可。
复杂度分析: 一个n元组的全排列的个数为n!个。暴力法慎用!!!
【源代码】
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define MAX 99999
using namespace std;
int main()
{
int num,c[10][10],i,j,temp[10],minCost=MAX,cost=0;
cout<<"输入任务个数:\n";
cin>>num;
cout<<"输入成本矩阵\n";
for(i=1;i<=num;i++){ //输入成本的矩阵值
for(j=1;j<=num;j++)
cin>>c[i][j];
temp[i]=i; //设置全排列辅助数组,默认升序
}
do{ //利用next_permutation函数依次求出数组的全排列
cost=0;
for(i=1;i<=num;i++)
cost+=c[i][temp[i]];
if(cost<minCost)minCost=cost; //记录最小代价
}while(next_permutation(temp+1,temp+1+num));
cout<<"最小成本:\n"<<minCost;
return 0;
}