1. 程式人生 > >演算法第五章實踐報告

演算法第五章實踐報告

1. 實踐題目

工作分配問題

2. 問題描述

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

輸入格式:

輸入資料的第一行有1 個正整數n (1≤n≤20)。接下來的n行,每行n個數,表示工作費用。

輸出格式:

將計算出的最小總費用輸出到螢幕。

輸入樣例:

在這裡給出一組輸入。例如:

3
10 2 3
2 3 4
3 4 5

輸出樣例:

在這裡給出相應的輸出。例如:

  9

3. 演算法描述

解空間:{1,2,······,n} ,第一個元素為第一個工作,元素內容對應為第幾個人

解空間樹:排列樹

#include<iostream>
using namespace std;

int n,cost=0;
int x[100],c[100][100];

void work(int i,int count){
if(i>n && count<cost){
cost = count;
return ;
}
if(count<cost)
for(int j=1;j<=n;j++)
if(x[j] == 0){
x[j] = 1;
work(i+1,count+c[i][j]);
x[j] = 0;
}
}

int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
x[j] = 0;
}
cost+=c[i][i];
}
work(1,0);
cout<<cost<<endl;
system("pause");
return 0;
}

4. 心得體會

寫程式碼之前先確定下排列樹是怎麼樣的,讓自己有一個清晰的思路,當中也遇到了一些困難,但是在與夥伴的合作之前,也能順利地完成該程式碼。