1. 程式人生 > >貪心演算法例項(五):小船過河問題

貪心演算法例項(五):小船過河問題

    N個人過河,船每次只能坐兩個人,船載每個人過河的所需時間不同t[i],每次過河的時間為船上的人的較慢的那個,問最快的過河時間。(船划過去要有一個人劃回來)
    最優選擇:
      先將所有人過河所需的時間按照升序排序,我們考慮把單獨過河所需要時間最多的兩個旅行者送到對岸去,有兩種方式:
         1.最快的和次快的過河,然後最快的將船劃回來;次慢的和最慢的過河,然後次快的將船劃回來,所需時間為:t[0]+2*t[1]+t[n-1];

         2.最快的和最慢的過河,然後最快的將船劃回來,最快的和次慢的過河,然後最快的將船劃回來,所需時間為:2*t[0]+t[n-2]+t[n-1]。

   具體實現程式碼如下所示:

/**
 * @Title: ShipCrossRiver.java
 * @Package greedyalgorithm
 * @Description: TODO
* @author peidong
 * @date 2017-5-19 上午9:03:51 
 * @version V1.0
 */
package greedyalgorithm;
import java.util.Arrays;
import java.util.Scanner;
/**
 * @ClassName: ShipCrossRiver
 * @Description:小船過河
* @date 
2017-5-19 上午9:03:51 * */ public class ShipCrossRiver { /** * * @Title: compare * @Description: 判斷大小 * @param a * @param b * @return * @return boolean * @throws */ public static boolean compare(int a, int b) { return a < b; } /** * @Title: main * @Description:
TODO * @param args * @return void * @throws */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("請輸入陣列長度:"); Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[] array = new int[N]; System.out.println("請輸入陣列元素:"); for (int i = 0; i < N; i++) { array[i] = sc.nextInt(); // 輸入陣列 } Arrays.sort(array); //升序排列 int sum = 0; while (N > 3) { //貪心演算法實現 int less = array[0] + 2 * array[1] + array[N - 1]; if ((array[0] + 2 * array[1] + array[N - 1]) > (2 * array[0] + array[N - 2] + array[N - 1])) // 兩種方式選擇 less = 2 * array[0] + array[N - 2] + array[N - 1]; sum += less; N -= 2; } //邊界條件討論 if (N == 3) { sum += array[0] + array[1] + array[2]; // 只剩三人 } else if (N == 2) { sum += array[1]; // 只剩兩人 } else { sum += array[0]; } System.out.println("總過河時間為:" + sum); } }