1. 程式人生 > >任務分配問題

任務分配問題

問題描述:

假設有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