书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:
本数 |
折扣 |
2 |
5% |
3 |
10% |
4 |
20% |
5 |
25% |
根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。
设计算法能够计算出读者购买一批书的最低价格。
设计思路:这道题我觉得用比较传统的动态规划便可以解决,是动态规划中比较常见的分组问题,算法的时间复杂度为O(n2):
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int m; 5 cin>>m; 6 double dp[10000]; 7 double x[5]={8,15.2,21.6,25.6,30}; 8 dp[1]=8;dp[2]=15.2;dp[3]=21.6;dp[4]=25.6;dp[5]=30; 9 for(int i=6;i<=m;i++){ 10 dp[i]=0; 11 for(int j=1;j<=5;j++){ 12 dp[i]=max(dp[i],x[j]+dp[i-j]); 13 } 14 } 15 cout<<dp[m]<<endl; 16 return 0; 17 }
运行结果: