題目:在節假日的時候,一般書店都會做**,假設一套書共有5冊,沒冊書的定價都是相同的30元,店家為了**推出了乙個方案,具體如下:
這裡的折扣是每本書都享受這個折扣,當然前提是購買不同的冊,比如買10本第一冊,那是不會有折扣的;買兩本第一冊,一本第二冊,那其中的有一本第一冊是不能享受折扣的。現在需要你設計乙個程式來計算出乙個讀者買一批書所需的最低**。
解題思路:
1、貪心演算法
貪心演算法基本操作就是:我每次都選擇最大的折扣就行了。仔細想想這個折扣方案支援的最大本數就是買不同的5冊,其實要我們考慮的就是買5—10本的情況。5本以下直接按最大折扣買就行了,10本以上也可以拆分為2-10本內的多個組合。
由此按照貪心演算法列出下表:
上表6-10本的前提是每次購買都有不同的5冊。
貪心演算法,每次進行能享受的最大折扣,這裡在買8本書時出了問題,貪心演算法的指引是5+3,折扣是1.55,但4+4的組合折扣是1.6.4,所以這裡貪心演算法走到這就算是不成立了。
2、動態規劃(窮舉)
想走捷徑使用貪心演算法走不通了,那麼老老實實使用窮舉法吧。動態規劃的中心思想是:把大問題分解為小問題,只考慮當前怎麼辦。對於本問題就是列出當前輪的所有買書情況。
為了方便說明,假如我們要買3第一冊、2本第二冊、1本第三冊、4本第四冊、5本第五冊,那麼我們表示為(x3, x2, x1, x4, x5),花的錢表示為f(x3, x2, x1, x4, x5),由於每本書的**是一樣的,故f(x3, x2, x1, x4, x5)和f(x1, x2, x3, x4, x5)花的錢肯定是一樣的,所有下面我們都按大到小的順序排列本數。
假如現在我們要買的書為(y1, y 2, y 3, y 4, y 5),這裡的下表不代表冊的數目,但是冊數是按大到小排列的,也就是y1冊》=y2冊》=y3冊》= y 4冊》=y5冊。在假設y5冊》=1。
好吧我們來開始買書吧。
等等,買5本以下的時候就出現了不同的組合了,選擇哪乙個組合繼續下去分解呢?當然可以把每種組合的情況都窮舉出來,但是仔細分析一下似乎先把本數多的買了,留下來的組合會多一些。
也就例如買4本數時,是否(y1-1, y2-1, y3-1, y4-1, y5)是最好的組合選擇,假設如果我們選擇(y1-1, y2-1, y3-1, y4, y5-1)得到了最終的最優解。能證明選取(y1-1, y2-1, y3-1, y4-1, y5)組合進行分解也能得到最優解,那麼我們每次都可以使用先買數目多的這種策略。
y4>= y5,無非就是兩種情況y4= y5或者y4>y5,如果y4= y5的話選取(y1-1, y2-1, y3-1, y4-1, y5)或(y1-1, y2-1, y3-1, y4, y5-1)進行分解肯定情況都是一樣的。
如果y4>y5的話,首先按照(y1-1, y2-1, y3-1, y4, y5-1)這個組合進行分解下去,我們每次沒冊肯定只能買一本,那麼到第四冊只剩最後一本的時候,第五本肯定就沒有了,也就是肯定會出現某個組合中有第四冊,而沒有第五冊。因為y4 > y5-1嘛。這樣我們總可以把有第四冊而沒有第五冊的這種組合中的第四冊換成第五冊,替換之後的情況(y1-1, y2-1, y3-1, y4-1, y5)進行分解後能到的分解情況。
換個理解方式,假設現在有3本第四冊,2本第五冊。先買一本第四冊剩餘四五冊數目(2,2);先買一本第五冊剩餘四五冊數目(3,1)。那麼四五冊數目為(3,1)構成的組合,(2,2)也能達到。
好了這樣我們就必須列出多有組合了,每次我們都按先買本書多的那一冊來選擇組合。
找出窮舉中最小值就是我們的最優解了,狀態方程為。
買書問題 程式設計之美1 4
買書問題,如果一種書籍五冊,單獨買一冊8元,買兩冊不同的打95折,買三冊不同的書籍9折,買四冊不同的書籍8折,買五冊不同書籍75折,問怎麼買書最便宜。比如買2本一冊,2本2冊,2本三冊,1本4冊,1本5冊 那麼最優打折方式就是 分兩次購買,一本一冊,一本二冊,一本三冊和一本四冊,然後就是剩下的書籍 ...
程式設計之美 1 4 買書問題
1.4 買書問題 在 節假日的時候,書店一般都會做 活動。由於 哈利波特 系列相當暢銷,店長決定通過 活動來回饋讀者。在銷售的 哈利波特 平裝本系列中,一共有五 卷,用編號0,1,2,3,4來表示。假設每一捲單獨銷售均需要8歐元。如果讀者一次購買不同的兩卷,就可以扣除5 的費用,三卷則更多。假設具體...
程式設計之美 買書問題
今天小夥伴在群裡給出了一道題 分享一道題,有興趣的可以做做哈。假設 冰與火之歌 有五卷,每一捲單獨買是20塊。兩卷連買減5 三卷連買減10 四卷連買減20 五卷連買減25 買相同的卷不打折。比如買兩本卷一,一本卷二,總 是58元。現買了一批書n,計算出它的最低 一看到這道題,瞬間就覺得這麼簡單有什麼...