1. 程式人生 > >演算法第五章上機實踐

演算法第五章上機實踐

實踐題目:工作分配問題

問題描述:設有n件工作分配給n個人。將工作i分配給第j個人所需的費用為cij 。 設計一個演算法,對於給定的工作費用,為每一個人都分配1 件不同的工作,並使總費用達到最小。

演算法描述:

解空間樹:

剪紙:將當前花費與當前最優解進行比較。

具體演算法:

#include<iostream>
using namespace std;
int a[20][20];
int p[20] = {0};
int n;
int best = 100000;
void backtrack(int cost,int j){
if(j == n && cost < best){
best = cost;
return;
}
else if(cost > best){
return;
}
else if(cost < best){
for(int i = 0;i < n;i++){
if(!p[i]){
p[i] = 1;
backtrack(cost + a[j][i],j + 1);
p[i] = 0;
}
}
}
return;
}
int main(){
cin>>n;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
cin>>a[i][j];
}
}
backtrack(0,0);
cout<<best;
return 0;
}

心得體會:回溯法要針對所給問題,定義問題的解空間,最好畫出樣例解空間樹,本題有點類似於旅行售貨員問題,按照書上的方法也大致能寫出個大概。