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

汽車加油問題(貪心演算法)

1.問題描述:一輛汽車加滿油後可行駛nkm。旅途中有若干加油站。設計一個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。

演算法設計:對於給定的nk個加油站位置,計算最少加油次數。

資料輸入: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.問題分析與解題思路

如果要使用貪心演算法解決問題,那麼需要檢查每一小段路程是否超過汽車滿油量時的最大支撐路程。如果有超過的,那麼汽車不可能走完這段路。否則,找到汽車滿油量時的最大支撐路程範圍內的最後一個加油站,加油後繼續用此方法前進