程式設計之美 第一章 1 4 買書問題

2021-06-25 16:11:50 字數 1430 閱讀 7036

/*

買書問題:

過程:接受輸入,對輸入按照從大到小排序(a,b,c,d,e),然後選取min,設定遞迴出口是全0

輸入:2 1 1 1 1

2 2 2 1 1

2 2 2 2 2

10 10 10 10 10

輸出:38.0

51.2

60.0

300.0

*/

#include #include #include #include #include using namespace std;

const int maxsize = 15;

int _icostarr[maxsize][maxsize][maxsize][maxsize][maxsize];//用作記憶化搜尋,原來可以設定5維陣列

int _isortarr[5];

bool compare(int a,int b)

void my_sort(int& a,int& b,int& c,int& d,int& e)//注意這些值返回後繼續用的,所以要用引用

int min(int a,int b)

int min(int a,int b,int c)

int min(int a,int b,int c,int d)

int min(int a,int b,int c,int d,int e)

int buybook(int a,int b,int c,int d,int e)

my_sort(a,b,c,d,e);//按照從大到小排序

int& iret = _icostarr[a][b][c][d][e];//注意,這裡使用引用,可以提高速度,並且會用ires為cost賦值

if(iret != -1)//記憶化搜尋,如果已經求解過,就直接返回,避免重複遞迴

//我們應該從最大的開始算,要不然就不好求最小值了

if(a >= 1 && b < 1)//如果只剩下乙個種類的書了,那麼最大值自然就是,沒有優惠,自己付錢

else if(a >= 1 && b >= 1 && c < 1)//如果a與b均剩餘,其餘三類書空了,可以享受95折

else if(a >= 1 && c >= 1 && d < 1)//如果a,b,c均有剩餘,可享受9折

else if(a >= 1 && d >= 1 && e < 1)//a,b,c,d,均剩餘,可享受8折

else if(a >= 1 && e >= 1)//a,b,c,d,e均有剩餘,可以享受7.5折

else }

int butbook_memory(int a,int b,int c,int d,int e)//記憶化搜尋,說白了就是剪枝,可以避免遞迴的效率降下

}void process()

}int main(int argc,char* argv)

買書問題 程式設計之美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 的費用,三卷則更多。假設具體...

程式設計之美 1 4 買書問題

題目 在節假日的時候,一般書店都會做 假設一套書共有5冊,沒冊書的定價都是相同的30元,店家為了 推出了乙個方案,具體如下 這裡的折扣是每本書都享受這個折扣,當然前提是購買不同的冊,比如買10本第一冊,那是不會有折扣的 買兩本第一冊,一本第二冊,那其中的有一本第一冊是不能享受折扣的。現在需要你設計乙...