1. 程式人生 > >(基於Java)演算法之貪心演算法——活動安排問題

(基於Java)演算法之貪心演算法——活動安排問題

貪心演算法(Greedy Algorithm:又名貪婪演算法。貪心演算法是指,在對問題求解時,總是做出在當期看來是最好的選擇。也就是說,貪心演算法能決定出最好的下一步,它不是從整體最優上考慮,而僅僅是在某種意義上的區域性最優解

值得注意的是:在某些問題上,用貪心演算法也能得到原問題的最優解。

活動安排問題描述:

設有n個活動的集合E={1,2,......,n},每個活動要是用同一個資源,而在同一時間內只能讓一個活動使用。每個活動i都有對應的開始時間si和結束時間fi,且si<fi。該問題就是要求出所給的活動集E中最大的時間相容活動子集合。

貪心策略:最早結束時間優先 (最晚開始時間優先也是可以的,原理上一樣)

定義:s[]代表開始時間,f[]代表結束時間,n表示活動個數

準備工作:先對f[]進行排序,而且保持s[]與f[]一致

下面貼出程式碼,因為排序可以查閱本博以前的博文,就不提供了,因此只有短短几行

public static int[] GreedyAc(int s[], int f[], int n){
	int x[] = new int[n];
	x[0] = 1;
	int j = 0; //j用來表示f陣列的下標值
	for(int i = 1; i < n; i++){
		//判斷下一個活動的開始時間是否比當前活動的結束時間晚
		if(s[i] >= f[j]){
			x[i] = 1;
			j = i;
		}
	}
	return x;
}

另外,貪心演算法也有一個跟0-1揹包問題類似的揹包問題,但是揹包問題的要求跟0-1揹包問題的要求不同,揹包問題不一定要把物品整個裝進揹包,可以把物品分成一部分來裝入揹包。貪心策略只要設計成 Vi與Wi的比值優先就可以了。

如果有什麼不對的地方或者有更好建議,歡迎評論留言