回溯法解決工作分配問題及分析

2022-08-26 14:27:28 字數 1317 閱讀 3211

工作分配問題

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

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

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

輸入樣例:3

10 2 3

2 3 4

3 4 5

輸出樣例:9

(1)解空間

解空間為,其中xi=1,2,3,4···,n,表示第i個人安排的工作號。

(2)解空間樹:以n=3為例,解空間樹如下:

(3)剪枝方法

演算法中設定了乙個陣列,用來存放工作的完成狀態,當工作完成時設為1,否則設為0。

(4)具體**

1 #include2

using

namespace

std;

3#define n 1000

4int cost[n][n]; //

表示第i個人完成第j件工作需要的費用

5int isc[n] = ; //

用於記錄第n個工作是否完成,0表示未完成

6intn;7

int scost; //

表示總費用89

void backstrack(int i, int

c) 10

16for(int j=0;j) 22}

23}2425

intmain()

2632

}33 scost = n; //

給總費用設定乙個很大的值

34 backstrack(0,0

);

35//

第乙個0表示從第乙個人開始 ,第二個0表示當前需要的總費用

36 cout<

37return0;

38 }

這次實踐的過程中,可能是對回溯法還不是很了解,對剪枝函式或約束函式也不是很明白,所以在程式設計的過程中總是出現執行超時的問題,最後請教了同學,然後和結對程式設計小夥伴順利地解決了問題。總體上對於回溯演算法的理解還並不是很透徹,還需要多實踐!

工作分配問題 (回溯法)

工作分配問題 time limit 1000 ms memory limit 65536 kib problem description 設有n件工作分配給n個人。將工作i分配給第j個人所需的費用為 cij。試設計乙個演算法,為每乙個人都分配1 件不同的工作,並使總費用達到最小。設計乙個演算法,對於...

回溯法 工作分配問題(dfs)

include using namespace std typedef long long ll const int maxn 1e5 5 const int inf 0x3f3f3f3f int n,c 20 20 將工作i分配給第j個人所需要的費用 每個人分配到乙個對應的工作,n個工作分別分配給...

回溯法 解決堡壘問題

描述 城堡是乙個4 4的方格,為了保衛城堡,現需要在某些格仔裡修建一些堡壘。城堡中的某些格仔是牆,其餘格仔都是空格,堡壘只能建在空格裡,每個堡壘都可以向上下左右四個方向射擊,如果兩個堡壘在同一行或同一列,且中間沒有牆相隔,則兩個堡壘都會把對方打掉。問對於給定的一種狀態,最多能夠修建幾個堡壘。輸入 每...