1. 程式人生 > >一個工作分配的演算法解析

一個工作分配的演算法解析

一道面試題如下:

現在有n位工程師和6項工作(編號為0至5),現在給出每個人能夠勝任的工作序號表
 (用一個字串表示,比如:045,表示某位工程師能夠勝任0號,4號,5號工作
 )。現在需要進行工作安排,每位工程師只能被安排到自己能夠勝任的工作當中去,兩位工程師不能安排到同一項工作當中去。
 如果兩種工作安排中有一個人被安排在的工作序號不一樣就被視為不同的工作安排,現在需要計算出有多少種不同工作安排計劃。
 
 輸入描述:
 
 輸入資料有n+1行: 第一行為工程師人數n(1 ≤ n ≤ 6) 接下來的n行,每行一個字串表示第i(1 ≤ i ≤
 n)個人能夠勝任的工作(字串不一定等長的)
 
 輸出描述:
 
 輸出一個整數,表示有多少種不同的工作安排方案
 
 輸入例子:
 
 6 012345 012345 012345 012345 012345 012345
 
 輸出例子:
 
  720

整理思路如下:

簡單要求時,每個人都可以工作每個工作,

工作,人可以任意分配,在可以分配時,不能不分配,工作個數》=人數
求可能的分配方案數
方案數=
人1工作1*剩餘方案+人1工作2*剩餘方案+。。。。+人1工作n*剩餘方案
剩餘方案:剩餘人選剩餘工作個數=人1工作1*剩餘方案+人1工作2*剩餘方案+。。。。+人1工作n*剩餘方案
如果剩餘的人=0,返回1,
如果剩餘工作=0,返回1

基礎程式碼如下

public int simplePersonWork(List<String> personList, List<String> workList) {
		int count = 0;
		String works = "workList=" + workList;
		//如果工作數或者人數剩餘1個,那麼方案總數=personList.size() * workList.size()
		if (personList.size() == 1 || workList.size() == 1) {
			count = personList.size() * workList.size();
			System.out.println(works + " personList=" + personList + " count=" + count);
			return count;
		}
		//迴圈工作,人1分配工作i
		for (int i = 0; i < workList.size(); i++) {
			List<String> subWorkList = new ArrayList<String>();
			subWorkList.addAll(workList);
			subWorkList.remove(i);
			//人1*剩餘的方案數
			//剩餘的人=1以後的人
			//,剩餘的工作=workList刪除當前work
			count = count + simplePersonWork(personList.subList(1, personList.size()), subWorkList);
		}

		System.out.println(works + " personList=" + personList + " count=" + count);
		return count;
	}