• 沒有找到結果。

1 貪心法

N/A
N/A
Protected

Academic year: 2022

Share "1 貪心法"

Copied!
3
0
0

加載中.... (立即查看全文)

全文

(1)

2016 資訊之芽 手寫作業 5 Deadline: 2016/04/09

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:

1

(2)

2016 資訊之芽 手寫作業 5 Deadline: 2016/04/09

對調前,結束的時間為 t1(j) =

j k=1

Cbk + Ebj對調後,結束的時間為 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

(3)

2016 資訊之芽 手寫作業 5 Deadline: 2016/04/09

習題

1. 在影片中提到了換零錢的題目,敘述如下:已知有 n 種貨幣面額 c1, c2,· · · , cn ,不 失一般性可以假設 c1 < c2 <· · · < cn。對於任意兩種面額 ci, cj (i < j),滿足 cj定是 ci 的倍數,也就是 ci|cj ,而且為了確保所有整數的面額都可以湊出,c1 = 1 (可以想成台灣零錢去掉 20 元的情況)。對於任意正整數 x ,請問如何使用盡量少 的零錢個數湊出 x 元呢?

(a) (20 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. (20 pts) 請參考 TOJ #70 或 UVA 10954 (Add all):已知 n 個數字 a1, a2,· · · , an每次操作可以將兩個數字 x, y 加起來得到 x + y ,並花費 x + y 。請證明將所有 n 個數加起來的花費最少的方法是:不斷選當前最小的兩個數字合併,直到剩下一個 數字。

3. (30 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

參考文獻

相關文件

[r]

[r]

[r]

● 應用 Greedy choice,將問題劃分成子問題,根據 optimal. substructure,可以持續應用

● 應用 Greedy choice ,將問題劃分成子問題,根據 optimal su bstructure ,可以持續應用 Greedy choice

貪心 Greedy. Lecture

貪心 Greedy. Lecture

[r]