汽車加油問題(貪心演算法)
阿新 • • 發佈:2019-02-06
1.問題描述:一輛汽車加滿油後可行駛nkm。旅途中有若干加油站。設計一個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。
演算法設計:對於給定的n和k個加油站位置,計算最少加油次數。
資料輸入:n:表示汽車加滿油後可行駛nkm
k:旅途中有k個加油站
k+1個整數:表示第k個加油站與第k-1個加油站之間的距離。第0個加油站表示出發地,汽車已加滿油。第k+1個加油站表示目的地。
資料輸出:最少加油次數和具體在哪幾個加油站加油。
例如: n=7 k=7
K+1個整數:1 2 3 4 5 1 6 6
最優值:4
2.相關程式碼:
#include<stdio.h> #define M 100 int main(){ int stations[M];//八個間距 int ins; //油箱滿的時候可以走的距離 int num;//中間加油站的數量 int i; int all=0;//總的加油次數 int lv;//油箱中的油量可以走的距離 printf("請輸入加油站的距離和數量\n"); scanf("%d%d",&ins,&num); lv=ins;//油量賦初值 printf("請輸入加油站間的距離\n"); for(i=0;i<num+1;i++){ scanf("%d",&stations[i]); } printf("加油站間的距離分別為:\n"); for(i=0;i<num+1;i++){ printf("%d ",stations[i]); } puts(""); for(i=0;i<num+1;i++){//如果油量可以支撐下一段路,則繼續走 if(stations[i]>ins) { printf("汽車不可能達到終點站"); return 0; } if(lv>=stations[i]){ lv-=stations[i]; } else { //否則加滿油 lv=ins-stations[i]; all++; } } printf("需要加油的總的加油站數量\n"); printf("%d\n",all);//輸出總的加油次數 }
3.問題分析與解題思路
如果要使用貪心演算法解決問題,那麼需要檢查每一小段路程是否超過汽車滿油量時的最大支撐路程。如果有超過的,那麼汽車不可能走完這段路。否則,找到汽車滿油量時的最大支撐路程範圍內的最後一個加油站,加油後繼續用此方法前進