程式設計之美 買書問題 動態規劃

2021-08-26 22:55:05 字數 2356 閱讀 1336

一,問題

上櫃的《哈利波特》平裝本系列,一共有五卷。假設每一捲單獨銷售均需8歐元。如果讀者一次購買不同的兩卷,就可以扣除5%的費用,三卷則更多。假設具體折扣的情況如下:

本數2 折扣 5%

本數3折扣 10%

本數4折扣 20%

本數 5 折扣25%

問題:設計出演算法,能夠計算出讀者所購買的一批書的最低**。

二,問題分析:

優化問題就用動態規劃、貪心演算法、分支限界輪番狂轟亂炸!!直到找到最優解!!

貪心策略

當書的數目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 這種兩種情況組合中都包括,通過選擇乙個折扣最低的可以排除掉第一種情況。

結論:貪心策略不可取

動態規劃

要用動態規劃解答首先要找到,動態規劃的遞迴公式,因為動態規劃是自頂向下層層遞迴,然後自底向下層層解答!最後根據底層結論求解最後結果。

五卷書的**相同都是8歐元,所以購買(1,0,0,0,0)跟(0,1,0,0,0)效果一樣。這裡就可以簡化為,讓所購買書按照本書遞增(遞減),從而方便討論。

要處理的引數為購買每種卷的個數,所以遞迴一定跟這五個引數相關。可以把引數按照從小到大順序排列。討論不為0的引數的個數,從而求出所有可能的折扣種類。然後從當前折扣種類中取**最小值。

(x1,x2,x3,x4,x5)代表購買每卷的個數,f(x1,

x2,x3,

x4,x5)

代表最低**。x1 < x2 < x3 < x4 < x5

f(x1,

x2,x3,

x4,x5)

=0 ;當所有引數都為0的情況(這也是退出遞迴的出口)

f(x1,

x2,x3,

x4,x5)

= min

三,動態規劃原始碼:

原始碼:

#include #include #include using namespace std;

const int larg = 100000;//定義乙個最大值,相當於取最小值時忽略這個位置的值

template void rerank(t m,int length)//氣泡排序}}

} double min(double a, double b, double c, double d, double e)//返回最小值

;

rerank(nn,5);

return nn[0];

}

double find_bestsol(int x1, int x2, int x3, int x4, int x5)//動態規劃(遞迴實現)

; rerank(n,5);//對n進行從小到大排序

x1 = n[0];

x2 = n[1];

x3 = n[2];

x4 = n[3];

x5 = n[4];

/* x1 < x2 < x3 < x4 < x5*/

if (n[0] > 0)//最小的都大於0;則所有卷數都大於0;然後將所有可能折扣羅列出來,返回最小值

else if ((n[0] == 0) && (n[1] > 0))

else if ((n[0] == 0) && (n[1] == 0) && (n[2] > 0))

else if ((n[0] == 0) && (n[1] == 0) && (n[2] == 0) && (n[3] > 0))

else if ((n[0] == 0) && (n[1] == 0) && (n[2] == 0) && (n[3] == 0) && (n[4] > 0))

else//都為0

}int main()

; int n1[5] = ;

double solution = find_bestsol(n1[0],n1[1],n1[2],n1[3],n1[4]);

cout<<"所花費的最少的錢為:"<}

《程式設計之美》買書問題 動態規劃

問題描述 在節假日的時候,書店一般都會做 活動。由於 哈利波特 系列相當暢銷,店長決定通過 活動來回饋讀者。上櫃的 哈利波特 平裝本系列中,一共有五卷。假設每一捲單獨銷售均需8歐元。如果讀者一次購買不同的兩卷,就可以扣除5 的費用,三卷則更多。假設具體折扣的情況如下 本數 折扣 2 5 3 10 4...

程式設計之美 買書問題

今天小夥伴在群裡給出了一道題 分享一道題,有興趣的可以做做哈。假設 冰與火之歌 有五卷,每一捲單獨買是20塊。兩卷連買減5 三卷連買減10 四卷連買減20 五卷連買減25 買相同的卷不打折。比如買兩本卷一,一本卷二,總 是58元。現買了一批書n,計算出它的最低 一看到這道題,瞬間就覺得這麼簡單有什麼...

《程式設計之美》之買書問題

這兩天剛看 程式設計之美 裡面的一些演算法有些確實經典,非常的感興趣,很喜歡自己先思考一下,然後看看書上的解析。對於1.4節的買書的問題,原書的解法二我看得不是很明白,而且解法一通過區域性最優解得到全域性最優解,這個肯定是不可取的,以下是我個人對這個問題的解法。本數 2 折扣 5 本數 3 折扣 1...