1. 程式人生 > >貪心演算法--汽車加油問題

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

基本要素:

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

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

過程:

  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,犯了比較低階的錯誤。結對能夠對問題有更加深的理解且解決問題快。