貪心法簡介

2022-10-10 16:27:12 字數 1917 閱讀 4164

1.貪心法的設計思想

例:n項活動,每項活動有開始時間和結束時間,不能同時舉行,設計安排使得被安排的活動數量最多

策略:將活動結束時間從小到大排列,從前向後選擇,只要與前面的活動相容,就將活動選入a

#include using

namespace

std;

int s[100], e[100], d[100

];void mswap(int &a, int &b)

void myquicksort(int a, int

b) mswap(s[t], s[j]);

mswap(e[t], e[j]);

mswap(d[t], d[j]);

myquicksort(a, j);

myquicksort(j + 1

, b);

}int

main()

myquicksort(

0, n);

pree = e[0

]; cout

<< d[0

];

for (int i = 1; i < n; ++i)

}cout

<< endl << count

}

2.貪心法正確性證明

有貨櫃1,2,...,n準備裝上輪船,其中貨櫃i的重量為wi,i=1,2,...,n.已知輪船最多裝載量為c,每個貨櫃重量wi≤c,且對貨櫃無體積限制.問如何選擇而使得裝上船的貨櫃數量最多?

(0-1揹包問題,貪心法比動態規劃更簡便)

【關於最終輸出的貨櫃標號,理應按原始標號輸出,但書中是按照排序後的標號輸出。敲**時,就重寫一下快排,按原始標號輸出。筆試時,就直接不加說明按照排序後標號輸出】

演算法1:

輸入:貨櫃集合n=,貨櫃i的重量w=

輸出:i⊆n,裝入船的貨櫃集合

1.sort(w)

2.i=

3.k=w1

4.for i 2 to n do

5.  if k+wi≤c

6.  then i<-i∪

7.    k<-k+wi

8.  else return i,k

【偽**的書寫規範有點迷,if...then...似乎不需要接end if,while、for後似乎也不需要接end?】

證明①:(數學歸納法)

對於任何正整數k,演算法1都對k個貨櫃的例項取得最優解

k=1時,w1≤c,任何演算法僅有一種裝法,顯然最優解成立

假設演算法對於規模為k的輸入都能得到最優解,考慮規模為k+1的輸入w[1..k+1],排序後有w[1]≤...≤w[k+1],去掉最輕的貨櫃

n'=n-

w'=w-

c'=c-w1

根據歸納假設,對於n',w',c',演算法1能得到最優解i'

令i=i'∪

則i是n的最優解,如若不然,則存在關於n的最優解i*,i*包含1(否則用1替換標號最小的貨櫃,也是最優解),|i*|>|i|

|i*-|>|i-|=|i'|

與i'是n'的最優解矛盾

故該演算法對規模為k+1的輸入也能得到最優解

綜上,命題得證

證明②:(交換論證)

思路:通過有限步替換,將任意最優解改變成貪心法的解

假設f=1,i2,...,in>是乙個最優解,如果在f中存在逆序,即存在wj

k,而f(j)>f(k)

交換f中j與k,得到排程g,下證明g為最優解:

k=w1+w2+...+wi

if=kg

j≤ij

k∴kf=c1+wk+c2≥c1+wj+c2=kg

i≥k時,kf=kg

故若f為最優解,則g為最優解

由代數定理得,經過有限次置換,可得到不存在逆序的最優解,即為演算法1得到的解

演算法 貪心法

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

演算法 貪心法

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

python貪心法 演算法 貪心

貪心演算法也被稱為貪婪演算法,它是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與...