貪心演算法與活動選擇問題 C 實現

2021-07-24 13:31:43 字數 1776 閱讀 5484

在之前的文章裡,作者講過動態規劃,然而貪心演算法和動態規劃是有區別的:貪心演算法並不是首先尋找子問題的最優解,然後再其中進行選擇,而是首先做出一次「貪心」選擇----在當時(區域性)看來是最優的選擇----然後求解選出的子問題,從而不必費心求解所有可能相關的子問題。

貪心演算法需要兩個關鍵的要素----貪心選擇性質與最優子結構。

我們可以通過做出區域性最優選擇來構造全域性最優解。在動態規劃中,每一步驟都要進行一次選擇,但選擇通常依賴於子問題的解。因此,我們通常以一種自底向上方法求解動態規劃問題,先求解較小的子問題,然後是較大的問題(我們也可以帶備忘的自頂向下法來求解。當然,即便使演算法自頂向下進行計算,我們仍然需要先求解子問題再進行選擇)。貪心演算法在第一次選擇之前不求解任何問題。乙個動態規劃問題通常是自底向上的,而貪心則是自頂向下的,進行一次又一次選擇,講個定的例項變的更小。

如果乙個問題的最優解包含其子問題的最優解,則稱此問題具有最優子結構性質。

活動選擇問題是用來求解乙個最大的互相相容的活動集合。假定有乙個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來解的話,就需要找到最優解的...

貪心演算法 活動選擇問題

前言 貪心演算法也是用來解決最優化問題,將乙個問題分成子問題,在現在子問題最優解的時,選擇當前看起來是最優的解,期望通過所做的區域性最優選擇來產生乙個全域性最優解。書中先從活動選擇問題來引入貪心演算法,分別採用動態規劃方法和貪心演算法進行分析。本篇筆記給出活動選擇問題的詳細分析過程,並給出詳細的實現...