魚塘釣魚(貪心演算法)--演算法設計
約翰有h(1≤h≤16)個小時的時間,在該地區有n(2≤n≤25)個湖,這些湖剛好分布在一條路線上,該路線是單向的。約翰從湖1出發,他可以在任乙個湖結束釣魚。但他只能從乙個湖到達另乙個與之相鄰的湖,而且不必每個湖都停留。
已知在最初5分鐘,湖i預計釣到魚的數量為fi(fi≥0)。以後每隔5分鐘,預計釣到魚的數量將以常數di(di≥0)遞減。如果某個時段預計釣到魚的數量小於或等於di,那麼在下一時段將釣不到魚。為簡單起見,假設沒有其它的釣魚者影響約翰的釣魚數量。
1.資料結構
每個湖預計釣到魚的數量,定義為陣列:
#define num 30
int f[num];
每個湖預計釣到魚的數量的遞減值,定義為陣列:
int d[num];
相鄰湖之間的旅行時間,定義為陣列:
int t[num];
釣魚計畫,定義為陣列:
int plan[num];
湖的個數n,用於釣魚的時間h,盡可能多的釣魚數量best。
2.搜尋,在任意乙個湖結束釣魚時的最優釣魚計畫
由於約翰從湖1出發,可以在任乙個湖結束釣魚,要得到最優解,就需要進行搜尋。
3.採用貪心策略,每次選擇魚最多的湖釣一次魚
對於每個湖來說,由於在任何時候魚的數目只和約翰在該湖裡釣魚的次數有關,和釣魚的總次數無關,所以這個策略是最優的。一共可以釣魚time次,每次在n個湖中選擇魚最多的乙個湖釣魚。
採用貪心演算法構造約翰的釣魚計畫。 可以認為約翰能從乙個湖「瞬間轉移」到另乙個湖,即在任意乙個時刻都可以從湖1到湖pos中任選乙個釣一次魚。
輸入:4 4 池塘數 時間(小時)
10 15 20 17 每個池塘的魚數
0 3 4 3 池塘之間的旅行時間
1 2 3 每個池塘預計釣到魚的數量的遞減值
輸出:24000
0number:480
#includeusing namespace std;
#define num 30
int f[num];
int d[num];
int t[num];
int plan[num];
int best;
void greedy(int pos,int time)
if(id!=-1)
else ++p[0];
}if(t>best)
for(int i=0;i>d[i];
}for(int i=0;i>t[i];
}h=h*12;
int time=0;
best=-1;
for(int i=1;i<=n&&h-time;i++)
for(int i=0;icout
10 15 20 17
0 3 4 3
1 2 3
輸出:24000
0number:480
*/
演算法 貪心演算法
把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...
演算法 貪心演算法
集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...
演算法 貪心演算法
貪心演算法,又稱貪婪演算法 greedy algorithm 是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優解出發來考慮,它所做出的僅是在某種意義上的區域性最優解。貪婪演算法是一種分階段的工作,在每乙個階段,可以認為所做決定是最好的,而不考慮將來的後果。這種 眼下能夠拿到...