類似的問題是:選點問題和區間覆蓋問題。
活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單、漂亮的方法使得盡可能多的活動能相容地使用公共資源。
設有n個活動的集合e=,其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活動i都有乙個要求使用該資源的起始時間si和乙個結束時間fi,且si 由於輸入的活動以其完成時間的非減序排列,所以演算法greedyselector每次總是選擇具有最早完成時間的相容活動加入集合a中。直觀上,按這種方法選擇相容活動為未安排活動留下盡可能多的時間。也就是說,該演算法的貪心選擇的意義是使剩餘的可安排時間段極大化,以便安排盡可能多的相容活動。
此演算法的效率極高。當輸入的活動已按結束時間的非減序排列,演算法只需o(n)的時間安排n個活動,使最多的活動能相容地使用公共資源。如果所給出的活動未按非減序排列,可以用o(nlogn)的時間重排。
例:設待安排的11個活動的開始時間和結束時間按結束時間的非減序排列如下:
演算法的計算過程如圖所示。圖中每行相應於演算法的一次迭代。陰影長條表示的活動是已選入集合a的活動,而空白長條表示的活動是當前正在檢查相容性的活動。
若被檢查的活動i的開始時間si小於最近選擇的活動j的結束時間fi,則不選擇活動i,否則選擇活動i加入集合a中。
貪心演算法並不總能求得問題的整體最優解。但對於活動安排問題,貪心演算法卻總能求得的整體最優解,即它最終所確定的相容活動集合a的規模最大。這個結論可以用數學歸納法證明。
//活動安排問題
public class activearr
else a [i] = false;
}return count;
} public static void main(string args )
; int f = ;
boolean a = new boolean [11];
activearr aa = new activearr();
count = aa.greedselector(s,f,a);
system.out.println("共有" + count + "活動可以舉行:");
system.out.println();
for (int i = 0;i <= 10;i ++)
if (a [i] == true)
system.out.println("第" + i + "活動可以舉行");
}
}
如果每個活動的價值不一樣。例如下面這道題:
乙個人在網上做專案,加入每天都有很多專案可以選,每個專案都有乙個開始時間和截止時間,假設每個專案的錢是一樣的,那麼在n天內,如何安排自己的接活才能保證賺錢最多。問題簡化後就是貪心的活動安排問題, 傳送門:假如這個時候,每個活的錢數是不同的,可以獲得最大的錢數是多少?
**如下:
#define max_tast 100
struct task;
bool taskinrange(const task &t, int s, int e)
int dp[max_tast][max_tast];
int ntask;
task atask[ntask];
int getmaxvalue(int s, int e)
if( s == e)
int maxvalue = 0;
for(int i = 0; i < ntask; i++)
} }return dp[s][e] = maxvalue;
}
如何優化:可以先把任務排序,然後搜尋到合適的任務豈止點,將列舉從o(n)降低到o(logn).
其實,本題還可以用動態規劃來做。思路如下:
設這些tasks最早開始於0,最晚結束於t。v[t]表示從t到t最多能賺的錢。設所有開始時間大於等於t的tasks的集合設為tasks[t],那麼
v[t] = max ( v[task] + v[endtime(task)] ) for task in tasks[i]
v[task]表示做task可以掙的錢。
活動安排問題 貪心演算法
問題表述 設有n個活動的集合 e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活 i都有乙個要求使用該資源的起始時間 si和乙個結束時間 fi,且 si 如果選擇了活動 i,則它在半開時間區間 si,fi 內占用資源。若區間 si,fi 與區間 sj,...
活動安排問題 貪心演算法
活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都要求使用同一資源,如演講會場等,而在同...
貪心演算法 活動安排問題
貪心演算法 活動安排問題 具體求解思路 首先將活動按照結束時間從小到大排序,然後將starttime i 大於finishtime i 1 的活動安排進去,由於活動結束時間是事前排好序的 具體排序方法可以看我之前的部落格 所以按照此方法,安排的活動相對於來說總是先結束的,這樣來說就可以盡量最大化的利...