任務分配問題(回溯演算法)
要求把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
*/
截圖: