1. 程式人生 > >任務分配問題(回溯演算法)

任務分配問題(回溯演算法)

要求把n項任務分配給n個人,每個人完成每項任務的成本不同,要求分配成本最小的最優分配方案。

程式碼:

#include <iostream>

#define N 205

using namespace std;

 

int c[N][N];

int x[N];

int BestM[N];

int n;

int Bmin=999999999;

 

int sum(int k)

{

    int temp=0;

    for(int i=1;i<=k;i++)

        temp+=c[i][x[i]];

    return temp;

}

 

void backtrack(int t)

{

    if (t==n){

        int ans=sum(n);

        if(ans<Bmin){

            Bmin=ans;

            for(int i=1;i<=n;i++)

            BestM[i]=x[i];

        }

    }

    else

      for (int i=t;i<=n;i++) {

        swap(x[t], x[i]);

        if(sum(t)<Bmin)

        backtrack(t+1);

        swap(x[t], x[i]);

      }

}

 

int main()

{

    cin>>n;

    for(int i=1;i<=n;i++)

      for(int j=1;j<=n;j++)

        cin>>c[i][j];

    for(int i=1;i<=n;i++)

        x[i]=i;

    backtrack(1);

    cout<<endl<<"最優分配成本:"<<Bmin<<endl;

    cout<<endl<<"最優成本方案:"<<endl;

    for(int i=1;i<=n;i++)

    cout<<""<<i<<" 個人完成第 "<<BestM[i]<<" 項任務"<<endl;

    return 0;

}

/*

4

9 2 7 8

6 4 3 7

6 8 1 8

7 6 9 4

 

55

50 43 1 58 60

87 22 5 62 71

62 98 97 27 38

56 57 96 73 71

92 36 43 27 95

*/

 

 

截圖: