1.貪心法的設計思想
例:n項活動,每項活動有開始時間和結束時間,不能同時舉行,設計安排使得被安排的活動數量最多
策略:將活動結束時間從小到大排列,從前向後選擇,只要與前面的活動相容,就將活動選入a
#include usingnamespace
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貪心法 演算法 貪心
貪心演算法也被稱為貪婪演算法,它是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與...