• 沒有找到結果。

1 貪心法

N/A
N/A
Protected

Academic year: 2022

Share "1 貪心法"

Copied!
3
0
0

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

全文

(1)

2022 資訊之芽手寫作業 5 Deadline: 2022/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:

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

j k=1

Cbk + Ebj

1

(2)

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

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

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

習題

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) 在不滿足∀i < j, ci|cj 的情況下,第一題的貪心算法仍然可以得到最佳 解嗎?如果可以,請證明之(可以的意思是不論面額和要湊出的金額為多少,

貪心算法得到的解都是正確的);如果不行,請給出造成反例的面額 c1· · · cn欲湊出的金額 x 、使用貪心法得到的解以及能比貪心法得到的解使用更少個零 錢的解。

(c) (20 pts) 在不滿足∀i < j, ci|cj 的情況下,第一題的貪心算法一定不能得到最佳 解嗎?如果不行,請證明之;如果可以,請給出一組貪心法適用的面額 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. (20 pts) 考慮以下的可分割背包問題:你有一個承重最多 L 的背包,並有 n 個物 品,其中第 i 個有重量 wi 與價值 ci,每個物品都可以分割,也就是說,對於任意 第 i 個物品,你可以選擇要只帶其中 p (0≤ p ≤ 1) 的部分。此時帶這個物品的重量 與效用就分別是 pwi 與 pci

請證明以下策略為最優解:將物品以 wci

i 由大至小排序,由前往後,如果能取完整 個物品則取,不能(背包滿了)則只取剛好讓背包滿的那部分。

3

參考文獻

相關文件

[r]

[r]

[r]

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

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

貪心 Greedy. Lecture

貪心 Greedy. Lecture

貪心 Greedy. Lecture