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