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

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

mes 情況 問題 錯誤 哪些 比較 false 選擇 加油

基本要素:

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

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

過程:

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

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