2017 資訊之芽 手寫作業 5 Deadline: 2017/04/01
1 貪心法
由於貪心法的證明實在太重要了,本次作業將讓大家練習許多證明。貪心法的證明 往往如以下的形式:由我們提出來的貪心演算法可以得到一組解 S ,而且這個解會滿 足一些特性 (視算法而定)。接著,對於任意一組不滿足該特性的解 S′ ,我們都可以 構造出一組更好的解 S′′ ,如果 S′′ 仍然不滿足該特性,我們又可以構造出更好的解 S′′′ · · · ,最後得到 S ,如此一來就可以證明 S 是最優的解了。
複習一下影片中提到的「誰先晚餐」問題,經簡化的題目是這樣的:
例題 1
有 n 位同學要吃晚餐,第 i 位同學想吃的食物需要 Ci 時間才能煮好,而他吃 掉食物所花的時間為 Ei ,且廚師同一時間只能煮一種食物。請證明,要讓廚師開 始煮菜到最後一位同學吃完,經過的時間最短的方法是讓吃飯時間 (Ei) 越久的越 先吃。
解答
假設由演算法得到的吃飯的順序為 a1, a2,· · · , an ,則此序列一定滿足特性 Eai ≥ Eai+1 。假設有另外一組吃飯順序為 b1, b2,· · · , bn,且不滿足該特性,則一 定存在兩個相鄰的人 bi, bi+1 滿足 Ebi < Ebi+1 。如果將這兩個人的吃飯順序對調,
則考慮第 j 個人吃飯結束的時間 (對調前為 t1(j) ,對調後為 t2(j) ,可以以下四 種人的情況:
(1) j < i:
對調前,結束的時間為 t1(j) =
∑j k=1
Cbk + Ebj; 對調後,結束的時間為 t2(j) =
∑j k=1
Cbk + Ebj。 (2) j = i:
對調前,結束的時間為 t1(j) = t1(i) =
i∑−1 k=1
Cbk+ Cbi+ Ebi; 對調後,結束的時間為 t2(j) = t2(i) =
i∑−1 k=1
Cbk+ Cbi+1+ Cbi+ Ebi。 (3) j = i + 1:
對調前,結束的時間為 t1(j) = t1(i + 1) =
i∑−1 k=1
Cbk + Cbi + Cbi+1+ Ebi+1; 對調後,結束的時間為 t2(j) = t2(i + 1) =
i∑−1 k=1
Cbk + Cbi+1 + Ebi+1。 (4) j > i + 1:
對調前,結束的時間為 t1(j) =
∑j k=1
Cbk + Ebj;
1
2017 資訊之芽 手寫作業 5 Deadline: 2017/04/01
對調後,結束的時間為 t2(j) =
∑j k=1
Cbk + Ebj。
我們要比較的是 max{t1(j)} 和 max{t2(j)} (1 ≤ j ≤ n) ,可以發現會讓 t1(j) 和 t2(j) 不同值的只有 j = i 和 j = i + 1 ,而且 t1(i + 1) ≥ t2(i) (∵ Ebi+1 >
Ebi), t1(i + 1) ≥ t2(i + 1) ,所以 max{t1(j)} ≥ max{t2(j)},也就是對調之後,最 後吃完的時間一定不會比對調前差。
最後,經過不斷的兩兩對調,一定可以將序列 b 變成序列 a (如 bubble sort 的過 程),且過程中,最後吃完的時間必為非嚴格遞減,得證序列 a 是這個問題的最優 解。
2
2017 資訊之芽 手寫作業 5 Deadline: 2017/04/01
習題
1. 在影片中提到了換零錢的題目,敘述如下:已知有 n 種貨幣面額 c1, c2,· · · , cn ,不 失一般性可以假設 c1 < c2 <· · · < cn。對於任意兩種面額 ci, cj (i < j),滿足 cj 一 定是 ci 的倍數,也就是 ci|cj ,而且為了確保所有整數的金額都可以湊出,c1 = 1 (例如台灣的硬幣去掉 20 元就滿足這些要求)。對於任意正整數 x ,請問如何使用 盡量少的零錢個數湊出 x 元呢?
(a) (30 pts) 請證明在題目的條件之下,盡量使用面額較高的零錢可以得到最佳解。
意即要湊出 x ,可以先使用一枚面額不大於 x 的最大面額零錢 ci ,剩下的 x− ci 元用相同的方法湊出。
(b) (10 pts) 在不滿足 ci|cj (∀i < j) 的情況下,第一題的貪心算法仍然可以得到最 佳解嗎?如果可以,請證明之(可以的意思是不論面額和要湊出的金額為多少,
貪心算法得到的解都是正確的);如果不行,請給出造成反例的面額 c1· · · cn 、 欲湊出的金額 x 、使用貪心法得到的解以及能比貪心法得到的解使用更少個零 錢的解。
(c) (20 pts) 在不滿足 ci|cj (∀i < j) 的情況下,第一題的貪心算法一定不能得到 最佳解嗎?如果不行,請證明之;如果可以,請給出一組貪心法適用的面額 c1· · · cn ,並證明在該組面額上,使用貪心法湊出任意金額都可以得到最佳解。
2. (40 pts) 已知 n 個區間 (l1, r1), (l2, r2),· · · , (ln, rn) ,希望可以挑選出盡量多個不重 疊的區間。請證明先將區間照右界 (ri) 由小到大排序後,依序挑選與當前挑出的區 間不重疊的區間,如此可以挑選出最多的區間。
(例:有四個區間 (1, 4), (2, 5), (3, 7), (6, 8) ,則上述貪心演算法會依序挑選 (1, 4) 和 (6, 8) ,得到最多可以挑選出 2 個區間。當然最佳解不唯一,演算法也可以改成照 區間左界由大到小排序,此時挑選出的區間就是 (6, 8) 和 (2, 5) ,但區間數量仍然 是最大值。)
3