編程之美1.6 飲料供貨

問題描述:
     在微軟亞洲研究院上班,大家早上來的第一件事是幹啥呢?查看郵件? No, 是去水房拿飲料:酸奶,豆漿,綠茶、王老吉、咖啡、可口可樂……(當然,還是有很多同事把拿飲料當做第二件事)。管理水房的阿姨們每天都會準備很多的飲料給大家,爲了提高服務質量,她們會統計大家對每種飲料的滿意度。一段時間後,阿姨們已經有了大批的數據。某天早上,當實習生小飛第一個衝進水房並一次拿了五瓶酸奶、四瓶王老吉、三瓶鮮橙多時,阿姨們逮住了他,要他幫忙。
     從阿姨們統計的數據中,小飛可以知道大家對每一種飲料的滿意度。阿姨們還告訴小飛, STC( Smart   Tea   Corp.) 負責給研究院供應飲料,每天總量爲 V。 STC 很神奇,他們提供的每種飲料之單個容量都是 2 的方冪,比如王老吉,都是 23 = 8 升的,可樂都是 25 = 32 升的。當然 STC 的存貨也是有限的,這會是每種飲料購買量的上限。統計數據中用飲料名字、容量、數量、滿意度描述每一種飲料。那麼,小飛如何完成這個任務,求出保證最大滿意度的購買量呢?

問題分析:
     現有的條件包括
1. 總量V
2. 每種飲料的單個容量
3. 每種飲料的存貨

     這個問題適合使用動態規劃來尋找最優解。首先方便討論我們按照書中的命名設好一些變量:

     “假設STC共提供n種飲料,用(Si、Vi、Ci、Hi、Bi)(對應的是飲料名字、容量、可能的最大數量、滿意度、實際購買量)來表示第i種飲料(i = 0, 1,…, n-1),其中可能的最大數量指如果僅買某種飲料的最大可能數量,比如對於第i中飲料Ci=V/Vi。”

     動態規劃的步驟包括:1.分析最優解結構特點;2.遞歸定義最優解;3.自底向上計算子問題直至得到最優解的代價;4.找到最優解。那麼我們接下來就按照這個步驟順序依次來進行分析。
     首先是最優解結構。最優解設爲是B1,B2,B3...Bn,那麼B1到Bn-1是這樣的一個子問題的最優解:總量V-Bn*Vn,在前n-1種飲料中選出滿意度最大的方案。這個很好證明,因爲假如這不是子問題的優化解,那麼原問題就可以得到一個更好的解,矛盾。接下來需要分析的就是這個子問題的解和它的父問題(可以這麼叫嗎)的最優解之間的關係,列出遞推方程。假如當前購買的飲料後剩餘的量爲k,那麼需要比較k和Vn之間的關係。假如不能整除,那麼顯然這樣的方案是不成立的,需要捨棄,可以給這個方案的滿意度設爲無窮小,假如可以整除,那麼就需要開始進行判斷。

     具體而言,我們可以設一個代價函數c[i,j]表示當前狀態的滿意度,其中i表示從前i種飲料中選擇,j表示當前剩餘的飲料量。當i=n,j=v的時候,我們就得到了原問題的最優滿意度。如何從c[i,j]的下一級子問題得到它的值呢,這個需要進行比較,設第i種飲料的購買量爲m,然後考察對於每一種m的可能情況下得到的值,選出最大的填入c[i,j]。當填完整個表後就得到了整體的最優解。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章