魚塘釣魚(貪心演算法) 演算法設計

2021-10-04 22:14:03 字數 1508 閱讀 7290

魚塘釣魚(貪心演算法)--演算法設計

約翰有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 是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優解出發來考慮,它所做出的僅是在某種意義上的區域性最優解。貪婪演算法是一種分階段的工作,在每乙個階段,可以認為所做決定是最好的,而不考慮將來的後果。這種 眼下能夠拿到...