提高题二: 汽车加油问题

 

一、实验目的与要求

1、掌握汽车加油问题的算法;

2、进一步掌握贪心算法;

二、实验题

     一辆汽车加满油后可以行驶N千米。旅途中有若干个加油站。若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。并证明你的算法能产生一个最优解。

三、实验提示

把两加油站的距离放在数组中,a[1..n]表示从起始位置开始跑,经过n个加油站,a[k]表示第k1个加油站到第k个加油站的距离。汽车在运行的过程中如果能跑到下一个站则不加油,否则要加油。

 

三、源代码

 

  1. import java.util.*; 
  2.  
  3. import java.io.*; 
  4.  
  5.   
  6.  
  7.   
  8.  
  9. public class SF_QicheJiayouzhan 
  10.  
  11.  
  12.        public static int greedy(int x[],int n){ 
  13.  
  14.               int sum=0
  15.  
  16.                      k=x.length, 
  17.  
  18.                      s=0
  19.  
  20.               for (int j=0;j<k ;j++ ) 
  21.  
  22.               { 
  23.  
  24.                      if (x[j]>n) 
  25.  
  26.                      { 
  27.  
  28.                             System.out.println("无法到达目的地!!!"); 
  29.  
  30.                             return -1; 
  31.  
  32.                      } 
  33.  
  34.                      
  35.  
  36.               } 
  37.  
  38.               for (int i=0;i<k ;i++ ) 
  39.  
  40.               { 
  41.  
  42.                      
  43.  
  44.                      s+=x[i]; 
  45.  
  46.                      if (s>n) 
  47.  
  48.                      { 
  49.  
  50.                             sum++; 
  51.  
  52.                             s=x[i]; 
  53.  
  54.   
  55.  
  56.                             } 
  57.  
  58.                      } 
  59.  
  60.               return sum; 
  61.  
  62.        } 
  63.  
  64.        public static void main(String[] args) 
  65.  
  66.        { 
  67.  
  68.               Scanner read =new Scanner(System.in); 
  69.  
  70.               System.out.println("请输入汽车加满油一次最大行驶旅程:"); 
  71.  
  72.               int n=read.nextInt(); 
  73.  
  74.               System.out.println("请输入加油站个数:"); 
  75.  
  76.               int num=read.nextInt(); 
  77.  
  78.               int a[]=new int[num]; 
  79.  
  80.               System.out.println("请输入每个加油站的相隔距离:"); 
  81.  
  82.               for (int i=0;i<num ;i++ ) 
  83.  
  84.               { 
  85.  
  86.                      a[i]=read.nextInt(); 
  87.  
  88.               } 
  89.  
  90.               int q=greedy(a,n); 
  91.  
  92.               System.out.println("要加油"+q+"次。"); 
  93.  
  94.        } 
  95.  

结果: