任务分配问题

问题描述:

假设有n个任务需要分配给n个人执行,每个人只执行一个任务,每个任务只由一个人执行。第i个人执行第j个任务的成本是Cij(1<=i,j<=n), 求解初最小成本的分配方案。

蛮力法:

算法描述:用矩阵表示任务分配问题,矩阵元素Cij(1<=i,j<=n)表示人员i执行任务j的成本。任务分配问题转化为,在矩阵中的每一行选取一个元素,这些元素分别属于不同的列。用一个n元组(j1,j2,...,jn)表示一个可能解,其中ji表示第i行中选择的列号。用暴力法解决此问题则可表示成,生成一个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;
}

算法分析: 一个n元组的全排列的个数为n!故时间复杂度为O(n!).

还发现一个不错的文章http://www.cnblogs.com/dwdxdy/p/3261742.html

猜你喜欢

转载自blog.csdn.net/ai_yue/article/details/84176530