貪心演算法例項(五):小船過河問題
阿新 • • 發佈:2019-02-01
N個人過河,船每次只能坐兩個人,船載每個人過河的所需時間不同t[i],每次過河的時間為船上的人的較慢的那個,問最快的過河時間。(船划過去要有一個人劃回來)
最優選擇:
先將所有人過河所需的時間按照升序排序,我們考慮把單獨過河所需要時間最多的兩個旅行者送到對岸去,有兩種方式:
1.最快的和次快的過河,然後最快的將船劃回來;次慢的和最慢的過河,然後次快的將船劃回來,所需時間為:t[0]+2*t[1]+t[n-1];
最優選擇:
先將所有人過河所需的時間按照升序排序,我們考慮把單獨過河所需要時間最多的兩個旅行者送到對岸去,有兩種方式:
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:小船過河 * @date2017-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); } }