1、什么是貪心算法
貪心算法采用自頂向下,以迭代的方法做出相繼的貪心選擇,每做一次貪心選擇就將所求問題簡化為一個規模更小的子問題,通過每一步貪心選擇,可得到問題的一個最優解,雖然每一步上都要保證能獲得局部最優解,但由此產生的全局解有時不一定是最優的。
貪心算法總是做出在當前看來最好的選擇。也就是貪心算法並不從整體最優上加以考慮,它所做出的選擇只是某種意義上的局部最優選擇。在一些情況下,即使貪心算法不能得到整體最優解,但其最終結果卻是最優解的很好的近似解。
2、貪心算法的基本要素
(1)貪心選擇性質
所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列局部最優的選擇,即貪心選擇達到。它也是貪心算法與動態規划算法的主要區別。
(2)最優子結構性質
當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。
3、貪心算法與動態規划算法的差異
參考資料:https://blog.csdn.net/u012110719/article/details/41928721
4、汽車加油問題的貪心選擇性質
(1)汽車加油問題:
一輛汽車加滿油后可行駛 n公里。旅途中有若干個加油站。設計一個有效算法,指出應 在哪些加油站停靠加油,使沿途加油次數最少。
輸入格式:第一行有 2 個正整數n和 k(k<=1000 ),表示汽車加滿油后可行駛n公里,且旅途中有 k個加油站。 第二行有 k+1 個整數,表示第 k 個加油站與第k-1 個加油站之間的距離。 第 0 個加油站表示出發地,汽車已加滿油。 第 k+1 個加油站表示目的地。
輸出格式:輸出最少加油次數。如果無法到達目的地,則輸出“No Solution!”。
輸入樣例:
7 7
1 2 3 4 5 1 6 6
輸出樣例:
4
(2)汽車加油問題的貪心選擇性質:
本道題的貪心選擇性質是在行駛到下一個加油站之前,判斷當前所剩的油量是否能支撐汽車到達下一個加油站,如果能,那么汽車不加油,反之,汽車加油。
該題設在加滿油后可行駛的N千米這段路程上任取兩個加油站a和b,且a距離始點比b距離始點近,則若在b加油不能到達終點那么在a加油一定不能到達終點,因為m+N<n+N,即在b點加油可行駛的路程比在a點加油可行駛的路程要長n-m千米,所以只要終點不在b、c之間且在c的右邊的話,根據貪心選擇,為使加油次數最少就會選擇距離加滿油得點遠一些的加油站去加油,因此,加油次數最少滿足貪心選擇性質。
(3)具體代碼:
1 #include <iostream> 2 using namespace std; 3 void Times(int n, int k, int l[]) 4 { 5 int flag=1; // 設置flag判斷汽車是否可以到達目的地 6 int total=0; // 表示汽車行駛過路程 7 int times=0; // 表示加油的次數 8 for(int i=0;i<=k;i++) { 9 if(n < l[i]) { 10 flag=0; // 當flag為0時,說明無法到達目的地 11 break; 12 } 13 total = total + l[i]; 14 if(total > n) { // 當汽車行駛路程大於汽油量時,需要加油 15 total = 0; 16 i = i-1; 17 times++; 18 } 19 } 20 if(flag==0) cout<<"No Solution!"; 21 else cout<<times; 22 } 23 24 int main() 25 { 26 int n,k; 27 int length[1001]; 28 cin>>n>>k; 29 for(int i=0;i<=k;i++) { 30 cin>>length[i]; 31 } 32 Times(n,k,length); 33 return 0; 34 }
5、貪心算法學習中遇到的問題及結對編程情況
一開始學習貪心算法時,感覺和動態規划算法區別不是很大,做題之后發現兩者之間還是有一些不同的。