動態規劃 買書問題

2022-08-19 23:54:11 字數 2510 閱讀 3685

在朱超迪的原**上做了一些修改

問題描述:

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

本數     折扣

2            5%

3           10%

4           20%

5           25%

在乙份訂單中,根據購買的卷數及本數,就會出現可以應用不同折扣規則的情況。但是,一本書只會應用乙個折扣規則。比如,讀者一共買了兩本卷一,一本卷二。那麼,可以享受到5%的折扣。另外一本卷一則不能享受折扣。如果有多種折扣,希望計算出的總額盡可能的低。

要求根據以上需求,設計出演算法,能夠計算出讀者所購買的一批書的最低**。

思路分析:

看到這個題目,任何人一開始想到的都是希望讓書本盡可能享受高折扣。但是隨著書本數目大於5本的時候,享受的總折扣就會相應出現了變化。            

舉個例子, 當輸入的資料為(2,2,2,1,1)的時候,如果按照享受最高折扣計算,那麼對應的折扣策略就會拆分變成(1,1,1,1,1)和(1,1,1,0,0)兩種,總**變為8×0.75×5+8×0.9×3= 51.6歐元。但是如果我們變一下策略,選擇4+4,購買序列變為(1,1,1,1,0)以及(1,1,1,0,1),那麼總共花費8×0.8×5+8×0.8×5=51.2歐元。

看到這裡,我們已經可以使用動態規劃通過計算總折扣數來計算最***格,當然,也可以採用優化的貪心演算法來實現,因為貪心演算法求解這類題目都是近似解,與最優解相近。

解題:先將現有條件轉換一下(用百分比表示書本單價的多少倍):

本數相對於書本單價的百分比

1100%

2190%

3270%

4320%

5375%

具體說明一下吧:

當只有一本書的時候,沒有折扣,所以為100%,即原價8歐元購買;

當有兩本不同的書本,享有5%折扣,原本總價為200% ,減掉每本5%折扣,為190%,即15.2歐元;

當有三本不同的書本,享有10%折扣,原本總價為300%,減掉每本10%折扣,為270%,即21.6歐元;

當有四本不同的書本,享有20%折扣,原本總價為400%,減掉每本的20%折扣,為320%,即25.6歐元;

當有五本不同的書本,享有25%折扣,原本總價為500%,減掉每本的25%折扣,為375%,即30歐元;

以上折扣資料存放在mindis[6]中

即mindis[6] = ;

根據上述條件描述,我們可以定義出一條狀態轉移方程(核心):

f[y1,y2,y3,y4,y5] = min

其中必須保證y1>=y2>=y3>=y4>=y5,這樣才不會出現更多的冗餘資料。例如:(2,2,2,1,1)和(1,2,1,2,2)雖然不同,但是結果都是一樣的。

下面是這個問題的**(我個人修改過了):

1

//買書問題23

float discount[6] = ;

4float price[6][6][6][6][6] = ;

5int num[6] = ;

6for (int i = 1; i <= 5; ++i)

7 cin >>num[i];

8int temp = 0

;9 bubble_sort(num, 5

);10

11int num1[6] = ;

12float arr[6] = ;

13float min = 0;14

for (int a5 = 0; a5 <= num[5];++a5)

15for (int a4 = a5; a4 <= num[4];++a4)

16for (int a3 = a4; a3 <= num[3]; ++a3)

17for (int a2 = a3; a2 <= num[2]; ++a2)

18for (int a1 = a2; a1 <= num[1]; ++a1)

28if (a4 > 0)37

if (a3 > 0)46

if (a2 > 0)55

if (a1 > 0

)64 min = arr[1

];65

for (int k = 1; k <= 5;++k)

66if ((arr[k] < min&&arr[k]>0)||min==0)min =arr[k];

67 price[a1][a2][a3][a4][a5] =min;68}

69 cout << price[num[1]][num[2]][num[3]][num[4]][num[5]] <70return0;

71 }

其中bubble_sort是乙個基本的氣泡排序演算法,由於問題規模有限,我就寫了個最簡單的氣泡排序,由於比較簡單所以這裡不再提供。

動態規劃 買書問題

相關的文章出處 buy book.cpp 定義控制台應用程式的入口點。include stdafx.h includeusing namespace std define i max 100 define j max 100 define k max 100 double m rember i ma...

買書問題 動態規劃C

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

買書問題的動態規劃實現

encoding utf 8 買書問題 貪心演算法是失效的,5,3 5,4單個並不是最優的,這次選擇會影響下一次的選擇的 比如反例 5,5,5,3,3 貪心的策略為 5,5,5,3,3 133.2,改進的貪心策略為 5,5,4,4,3 132.8,而實際的最優的策略為 5,4,4,4,4 132.4...