一,問題
上櫃的《哈利波特》平裝本系列,一共有五卷。假設每一捲單獨銷售均需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...