在之前的文章裡,作者講過動態規劃,然而貪心演算法和動態規劃是有區別的:貪心演算法並不是首先尋找子問題的最優解,然後再其中進行選擇,而是首先做出一次「貪心」選擇----在當時(區域性)看來是最優的選擇----然後求解選出的子問題,從而不必費心求解所有可能相關的子問題。
貪心演算法需要兩個關鍵的要素----貪心選擇性質與最優子結構。
我們可以通過做出區域性最優選擇來構造全域性最優解。在動態規劃中,每一步驟都要進行一次選擇,但選擇通常依賴於子問題的解。因此,我們通常以一種自底向上方法求解動態規劃問題,先求解較小的子問題,然後是較大的問題(我們也可以帶備忘的自頂向下法來求解。當然,即便使演算法自頂向下進行計算,我們仍然需要先求解子問題再進行選擇)。貪心演算法在第一次選擇之前不求解任何問題。乙個動態規劃問題通常是自底向上的,而貪心則是自頂向下的,進行一次又一次選擇,講個定的例項變的更小。
如果乙個問題的最優解包含其子問題的最優解,則稱此問題具有最優子結構性質。
活動選擇問題是用來求解乙個最大的互相相容的活動集合。假定有乙個n
nn個活動的集合s
=s=\
s=,這些活動使用同乙個資源(例如乙個階梯教室),而這個資源在某一時刻只能共乙個活動使用。每個活動a
ia_i
ai都有乙個開始時間,和乙個結束時間f
if_i
fi,其中0≤s
i≤fi
<
∞0\leq s_i\leq f_i<\infty
0≤si≤
fi<
∞。如果被選中,任務a
ia_i
ai發生在半開時間區間[si
,fi)
[s_i,f_i)
[si,f
i)期間。如果兩個活動a
ia_i
ai和s
js_j
sj滿足[si
,fi)
[s_i,f_i)
[si,f
i)和[sj
,fj)
[s_j,f_j)
[sj,f
j)不重疊,則稱他們是相容的。也就是說,若si≥
fi
s_i\geq f_i
si≥fi
或sj≥f
is_j\geq f_i
sj≥fi
,則a
ia_i
ai和a
ja_j
aj是相容的。在活動選擇問題中,我們希望選出乙個最大相容活動集。
假定活動已經按時間結束的單調遞增順序排序:
#include
#include
using
namespace std;
//data.
vector<
int> temp_vecs =
, temp_vecf =
;//greedy.
vector<
int>
greedy_activity_selector
(vector<
int>
const
&temp_vecs, vector<
int>
const
&temp_vecf)
;auto temp_k =1;
for(
auto temp_m =
1; temp_m <= temp_n;
++temp_m)
}return temp_veca;
}int
main()
return0;
}
貪心演算法與活動選擇問題
一 問題描述 有乙個n個活動的集合s 這些活動使用同乙個資源,而這個資源在某個時刻只能供乙個活動使用。每個活動ai都有乙個開始時間si和乙個結束時間fi,其中0 si fi 如果被選中,任務ai佔據半開區間時間 si,fi 如果兩個活動 和 不重疊,則稱它們是相容的。該問題就是要找出最大相容子集。例...
貪心演算法 活動選擇問題
活動選擇問題 就是給定一組活動的開始時間和結束時間,然後他們都需要使用到乙個資源,這個資源每次只有乙個活動可以用,要求求出乙個最大的相互相容的活動子集。首先定義了乙個集合sij 其中s就是所有活動的集合,fi是活動ai的完成時間si是活動ai的開始時間。這道題如果是用dp來解的話,就需要找到最優解的...
貪心演算法 活動選擇問題
前言 貪心演算法也是用來解決最優化問題,將乙個問題分成子問題,在現在子問題最優解的時,選擇當前看起來是最優的解,期望通過所做的區域性最優選擇來產生乙個全域性最優解。書中先從活動選擇問題來引入貪心演算法,分別採用動態規劃方法和貪心演算法進行分析。本篇筆記給出活動選擇問題的詳細分析過程,並給出詳細的實現...