工作分配問題

工作分配問題

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


樣例輸入:

  3

  10 2 3

  2 3 4

  3 4 5

樣例輸出:

  9


解:

工作分配問題:
 
由於每個人都必須分配到工作,在這裏可以建一個二維數組c[i][j],用以表示i號工人完成j號工作所需的費用。
給定一個循環,從第1個工人開始循環分配工作,直到所有工人都分配到。
爲第i個工人分配工作時,再循環檢查每個工作是否已被分配,沒有則分配給i號工人,否則檢查下一個工作。
可以用一個一維數組x[j]來表示第j號工作是否被分配,未分配則x[j]=0,否則x[j]=1。
利用回溯思想,在工人循環結束後回到上一工人,取消此次分配的工作,而去分配下一工作直到可以分配爲止。
這樣,一直回溯到第1個工人後,就能得到所有的可行解。
在檢查工作分配時,其實就是判斷取得可行解時的二維數組的一下標都不相同,二下標同樣不相同。


#include <stdio.h>

int n;
int c[100][100];
int a[100];
int minprice=99999;
int price=0;

bool ok(int t){
	int i;
	for(i=0;i<t;i++)
		if(a[i]==a[t])
			return false;
		return true;
}
void dfs(int t){
	int i;
	if(t==n){//爲第t個人找工作
	int i;
		if(price<minprice)
			minprice=price;
		return;
	}
	for(i=0;i<n;i++){
		a[t]=i;//給第t個人分配第i個工作
		price+=c[t][i];
		if(ok(t))
			dfs(t+1);
		price-=c[t][i];
	}
}

int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&c[i][j]);
		}
	} 
	 
	dfs(0);
	printf("%d\n",minprice);
	return 0;
 } 






發佈了161 篇原創文章 · 獲贊 70 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章