貪心算法--汽車加油問題


基本要素:

貪心選擇:在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。

最優子結構:當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。

過程:

  1. 建立數學模型來描述問題;
  2. 把求解的問題分成若干個子問題;
  3. 對每一子問題求解,得到子問題的局部最優解;
  4. 把子問題的解局部最優解合成原來解問題的一個解。

汽車加油問題

一輛汽車加滿油后可行駛 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

貪心性質分析:

找到汽車滿油量時可以行駛的最大路程范圍內的最后一個加油站,加油后則繼續用此方法前進。需要檢查每一小段路程是否超過汽車滿油量時的最大支撐路程。

代碼

#include<iostream>

using namespace std;

int n,k;
int a[1000];
int main()
{
  cin>>n>>k;
  for(int i=0;i<=k;i++)
    cin>>a[i];
  int minCount=0,drive=n;
  bool flag=true;
  for(int i=0;i<=k;i++){
    if(drive-a[i]>=0)
    drive-=a[i];
    else{
    drive=n;
    drive-=a[i];
    if(drive<0)flag=false;
    minCount++;}}
  if(!flag)cout<<"No Solution!"<<endl;
  else cout<<minCount<<endl;
  return 0;
}

遇到的問題及結對情況

剛開始解決輸出"No Solution!"時,采用直接打印然后break,犯了比較低級的錯誤。結對能夠對問題有更加深的理解且解決問題快。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM