算法设计与分析——任务分配问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28666193/article/details/53352427

【问题描述】

假设有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;
}

猜你喜欢

转载自blog.csdn.net/qq_28666193/article/details/53352427