演算法學習之貪心法

2021-10-07 17:49:57 字數 1443 閱讀 2649

貪心法是在對問題進行求解時,只做出在當前情況下最好的解,即區域性最優解(而動態規劃是整體最優解)

建立數學模型,來描述問題

把問題分解成若干個子問題

對每一子問題求解,得到子問題區域性最優解

把每乙個子問題的區域性最優解合併成乙個解

有n個需要在同一天使用同乙個教室的活動a1,a2,…,an,教室同一時刻只能由乙個活動使用。每個活動ai都有乙個開始時間si和結束時間fi 。一旦被選擇後,活動ai就佔據半開時間區間[si,fi)。如果[si,fi]和[sj,fj]互不重疊,ai和aj兩個活動就可以被安排在這一天。該問題就是要安排這些活動使得盡量多的活動能不衝突的舉行。例如下圖所示的活動集合s,其中各項活動按照結束時間單調遞增排序。
#include

#include

using

namespace std;

struct act act[

100]

;bool

cmp(act a, act b)

intmain()

sort

(act, act + m, cmp)

;//排序函式

cout <<

"可最多安排的活動為:"

<< endl;

cout << act[0]

.start <<

" "<< act[0]

.end << endl;

int sum =1;

//安排的活動總數

int i =0;

for(

int j =

1; j < m; j++)}

cout <<

"最多安排的活動總數為:"

<< sum;

}

解析:該題可採用貪心法,按活動的最早結束時間來獲得區域性最優解
假設1元、2元、5元、10元、20元、50元、100元的紙幣分別有c0, c1, c2, c3, c4, c5, c6張。現在要用這些錢來支付k元,          至少要用多少張紙幣?
#include

using

namespace std;

intmain()

;//每張面值對應的數量

int value=

;//面值

cout <<

"請輸入你需要找零的金額:"

<< endl;

int n;

cin >> n;

int sum=0;

//找零錢幣總數

for(

int i =

6; i >=

0; i--)}

if(n ==0)

else

}

解析:運用貪心法,每一步找面值最大的紙幣

演算法學習 貪心法

只選擇乙個子問題 1.快2.不能保證獲得最優解,可以作為近似解,一般,在特殊情況下可保證最優解。3.適合於組合優化問題 貪心選擇策略 分解方案 s s0,c c0 部分解s,候選集c while complete s 解擴充套件 c c c中引數重新計算以及候選集調整 注意 實現時dist 的初始值...

演算法 貪心法

動態規劃在某一步決定優化函式的最大或者最小值時候,需要考慮子問題的優化函式值,從中選出最優的結果。貪心法 也是多不判斷,不考慮子問題的計算結果,根據當時情況採取 只顧眼前的 貪心策略決定取捨,工作量少於動態規劃很多,更具效率 可導致區域性最優化而不是全域性優化 n項活動,使用同乙個禮堂問題 si 和...

演算法 貪心法

感謝華北電力大學王墨玉老師的ppt 基礎知識 應用條件 最優子結構性質 原問題包含了其子問題的最優解 對於乙個問題可能會有不同的量度標準,選擇其中可以獲得最優解的量度標準是貪心法設計的核心問題 例題活動安排問題 可求得最優解 int greedyselector int s,int f,int a ...