這兩天剛看《程式設計之美》,裡面的一些演算法有些確實經典,非常的感興趣,很喜歡自己先思考一下,然後看看書上的解析。對於1.4節的買書的問題,原書的解法二我看得不是很明白,而且解法一通過區域性最優解得到全域性最優解,這個肯定是不可取的,以下是我個人對這個問題的解法。
本數 2 折扣 5%
本數 3 折扣 10%
本數 4 折扣 20%
本數 5 折扣 25%
問題:設計出演算法,能夠計算出讀者所購買的一批書的最低**。
問題分析:
我覺得這個問題可以抽象為n個雞蛋放在5個不同的籃子裡的問題,其實質也就是組合的問題。
當書的數目n<5時,直接按照折扣購買
當書的數目n>5時,情況如下:
依此可以窮舉出每一種組合的情況,對於任意一種情況(i,j,k,m,n)進行分析
先找出是所有書中5種不同的書,如果有則按照5本書折扣價購買
其次找出剩餘書中所有4種書,如果有則按照4本書的折扣價購買
再找出剩餘書中所有3種書,如果有則按照3本書的折扣價購買
最後在剩餘書中找出所有2種書,如果有則按照2本書的折扣價購買
剩下的書則按照全價購買。
對於書中提到的貪心法的反例,比如買8本書時,可以拆成5+3,折扣為1.55;也可以拆成4+4,折扣為1.6 這種兩種情況組合中都包括,通過選擇乙個折扣最低的可以排除掉第一種情況。
本演算法採用的是窮舉發,在時間複雜度上比較浪費,比如1+1+1+1+2,2+1+1+1+1,1+2+1+1+1,1+1+2+1+1,1+1+1+1+2+1的情況是一樣的,但是演算法中沒有排除,空間複雜度為常量級。
本演算法為確定性演算法,其實還可以考慮非確定性演算法
程式設計之美之買書問題
關於程式設計之美中買書的問題,我困擾了好久。當然,我的數學能力不強,領悟能力又差,所以才困擾了這麼久。不過,在本人的堅持下,終於理解透徹。為了記住這一時刻,更為了免除以後忘記的可能,暫時記錄如下。書中關於證明f y1 1,y2 1,y3 1,y4 1,y5 和f y1 1,y2 1,y3 1,y4,...
程式設計之美 買書問題
今天小夥伴在群裡給出了一道題 分享一道題,有興趣的可以做做哈。假設 冰與火之歌 有五卷,每一捲單獨買是20塊。兩卷連買減5 三卷連買減10 四卷連買減20 五卷連買減25 買相同的卷不打折。比如買兩本卷一,一本卷二,總 是58元。現買了一批書n,計算出它的最低 一看到這道題,瞬間就覺得這麼簡單有什麼...
買書問題 程式設計之美1 4
買書問題,如果一種書籍五冊,單獨買一冊8元,買兩冊不同的打95折,買三冊不同的書籍9折,買四冊不同的書籍8折,買五冊不同書籍75折,問怎麼買書最便宜。比如買2本一冊,2本2冊,2本三冊,1本4冊,1本5冊 那麼最優打折方式就是 分兩次購買,一本一冊,一本二冊,一本三冊和一本四冊,然後就是剩下的書籍 ...