貪心算法--汽車加油問題
阿新 • • 發佈:2018-11-28
mes 情況 問題 錯誤 哪些 比較 false 選擇 加油
基本要素:
貪心選擇:在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。
最優子結構:當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。
過程:
- 建立數學模型來描述問題;
- 把求解的問題分成若幹個子問題;
- 對每一子問題求解,得到子問題的局部最優解;
- 把子問題的解局部最優解合成原來解問題的一個解。
汽車加油問題
一輛汽車加滿油後可行駛 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,犯了比較低級的錯誤。結對能夠對問題有更加深的理解且解決問題快。
貪心算法--汽車加油問題