1. 程式人生 > >貪心演算法理解

貪心演算法理解

貪心演算法

基本思想:

貪心演算法通過一系列的選擇來得到問題的解,其中每一個選擇都是當前狀態下區域性最好的選擇,即貪心選擇

它有兩個重要性質:貪心選擇性質和最優子結構性質。

貪心選擇性質:指問題的最優解可以通過一系列區域性最優解的選擇得到。貪心演算法做貪心選擇可

以依賴於以往所做過的選擇,但決不依賴於將來所作的選擇,也不依賴於子問題的解。

最優子結構性質:指問題的最優解包含其子問題的最優解。

 

7-1:汽車加油問題

題目大意:

汽車加滿油後可行駛n公里,途中存在一些加油站,求出汽車到達終點時沿途加油次數

最少的方案並求出加油次數。輸入n,k。其中n為汽車加滿油行駛公里數,k為加油站個數,接下

來有k+1個數表示每個加油站之間的距離。加油站0表示出發點,加油站k+1表示終點,若無法達到

終點則輸出No Solution!,否則輸出最少加油次數。

貪心策略:

若要汽車到達終點沿途加油的次數最少,只需要每次儘可能走最遠,去較遠的加油站加油即可。每次判斷該

汽車能否順利到達下一個加油站,若能到達則在下一個加油站繼續判斷,直到汽車剩餘的油無法支撐汽車前

往下一個加油站時,就在當前站加油。這樣能夠保證汽車在一定油量時儘可能走的更遠。加油次數最少。

程式碼:

#include<iostream>
using namespace std;
int n,k;
int a[1009]; int main() { cin>>n>>k; for(int i=0;i<=k;i++) cin>>a[i]; int ans=0,count=n; bool flag=true; for(int i=0;i<=k;i++) { if(count-a[i]>=0) //若能到達下一個加油站 count-=a[i]; else //
否則在當前加油站加油 { count=n; count-=a[i]; if(count<0)flag=false; //如果加滿油依然不能到達下一個加油站,則無法到達終點 ans++; //加油次數 } } if(!flag)cout<<"No Solution!"<<endl; else cout<<ans<<endl; return 0; }

 

結對程式設計以及學習心得:

在本章學習中出現的問題較少,大概因為貪心思想在生活中較常見,因此理解起來不太困難

在學習中有些貪心策略的證明還是較難理解,需要經常回顧練習才能較熟練。結對程式設計中兩個

人的配合比之前更好一些,能夠在實踐中一同理解一起做出題目,希望能夠更進一步。