問題描述
條件:磁盤空間有限;程序大小不同。
在有限的磁盤上存放盡可能多的程序,就要求選擇的程序盡可能小。
算法描述
貪心算法:總是從可選程序中選擇最小的試放入磁盤。
1. 排序:對程序按大小升序排;
2. 循環添加:從i = 1開始,選擇排序后序列的第 i 個(即a[i],1 <= i <= n)個加入暫存(sum,初始為0),判斷是否滿足sum小於磁盤空間,是則計數(count++),否則跳出循環;
反證法證明貪心選擇可以推出最優解:
1. 證明選擇可以從貪心(最小程序)開始:選擇從最小程序開始即解不為空時可以選擇最小程序。假設解不為空,從這樣得到的選擇序列中任選一個,用最小程序替換,放入程序數(count)不變;
2. 證明最優子結構性質:在解不為空、第一次可以選擇最小程序的前提下,假設在最優解中去掉第一次選擇的最小程序后得到的子問題的最優解的count_0大於原問題最優解的count_1-1,那么將最小程序加入選擇產生的解的count_2大於count_1,此時count_1不是最優解,這不成立。故此問題具有最優子結構性質。
時間和空間復雜度分析
時間復雜度:程序進行了一次快排(O(nlogn))和循環(O(n)),故時間復雜度為O(nlogn);
空間復雜度:程序new了一個一維數組(a[n])用於存放每個程序的大小,故時間復雜度為O(n)。
心得體會
雖然參考會場安排問題的證明大致寫了以上證明,但我對貪心算法的正確性的證明還是有很大的疑惑。