买书动态规划java_《编程之美》买书问题——动态规划
问题描述:
在节假日的时候,书店一般都会做促销活动。由于《哈利波特》系列相当畅销,店长决定通过促销活动来回馈读者。上柜的《哈利波特》平装本系列中,一共有五卷。假设每一卷单独销售均需8欧元。如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多。假设具体折扣的情况如下:
本数
折扣
2
5%
3
10%
4
20%
5
25%
在一份订单中,根据购买的卷数及本数,就会出现可以应用不同折扣规则的情况。但是,一本书只会应用一个折扣规则。比如,读者一共买了两本卷一,一本卷二。那么,可以享受到5%的折扣。另外一本卷一则不能享受折扣。如果有多种折扣,希望计算出的总额尽可能的低。
要求根据以上需求,设计出算法,能够计算出读者所购买的一批书的最低价格。
输入样例:
1 1 1 0 0
1 1 1 1 1
输出样例:
21.6
30
思路分析:
看到这个题目,任何人一开始想到的都是希望让书本尽可能享受高折扣。但是随着书本数目大于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欧元。
看到这里,我们已经可以使用动态规划通过计算总折扣数来计算最优惠价格,当然,也可以采用优化的贪心算法来实现,因为贪心算法求解这类题目都是近似解,与最优解相近。
解题:
先将现有条件转换一下(用百分比表示书本单价的多少倍):
本数
相对于书本单价的百分比
1
100%
2
190%
3
270%
4
320%
5
375%
具体说明一下吧:
当只有一本书的时候,没有折扣,所以为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] = {0 , 1.9 , 2.7 , 3.2 , 3.75 };
根据上述条件描述,我们可以定义出一条状态转移方程(核心):
F[Y1,Y2,Y3,Y4,Y5] = min{
8*minDis[5]+F(Y1-1,Y2-1,Y3-1,Y4-1,Y5-1),
8*minDis[4]+F(Y1-1,Y2-1,Y3-1,Y4-1,Y5),
8*minDis[3]+F(Y1-1,Y2-1,Y3-1,Y4,Y5),
8*minDis[2]+F(Y1-1,Y2-1,Y3,Y4,Y5),
8*minDis[1]+F(Y1-1,Y2,Y3,Y4,Y5)
}
其中必须保证Y1>=Y2>=Y3>=Y4>=Y5,这样才不会出现更多的冗余数据。例如:(2,2,2,1,1)和(1,2,1,2,2)虽然不同,但是结果都是一样的。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
int main(void)
{
double discount[6] = { 0, 1, 1.9, 2.7, 3.2, 3.75 };//存放购买不同本数的折扣
int book[6] = { 0 };
int bookCount = 0;//书本总类目
int bookPrice = 8;//书本价格
cout << "请输入五类书中每一类书的数目:" << endl;
for (int i = 1; i <= 5; i++)
{
cin >> book[i];//输入各类书本的数目
}
sort(book + 1, book + sizeof(book) / sizeof(int), greater());//保证Y1>=Y2>=Y3>=Y4>=Y5
float arr[6][6][6][6][6] = { 0 };//存放折扣计算过程
float minDis[6][6][6][6][6] = { 0 };//存放享有的最大折扣
int y1 = 0;
int y2 = 0;
int y3 = 0;
int y4 = 0;
int y5 = 0;
/*
实现公式F(Y1,Y2,Y3,Y4,Y5) = MIN{...} 时间复杂度O(Y1×Y2×Y3×Y4×Y5) 空间复杂度为(Y1×Y2×Y3×Y4×Y5)
*/
for (y5 = 0; y5 <= book[5]; y5++)
{
for (y4 = y5; y4 <= book[4]; y4++)
{
for (y3 = y4; y3 <= book[3]; y3++)
{
for (y2 = y3; y2 <= book[2]; y2++)
{
for (y1 = y2; y1 <= book[1]; y1++)
{
double a[6] = { 0 };//存放不同购书策略所产生的临时数据
int dir[5] = {0};//存放下一步策略的Y1 Y2 Y3 Y4 Y5
if (y5 > 0)
{
dir[4] = y5 - 1;
dir[3] = y4 - 1;
dir[2] = y3 - 1;
dir[1] = y2 - 1;
dir[0] = y1 - 1;
sort(dir, dir + 5, greater());//保证Y1>=Y2>=Y3>=Y4>=Y5
a[5] = arr[dir[0]][dir[1]][dir[2]][dir[3]][dir[4]] + discount[5] * bookPrice;
}
if (y4 > 0)
{
dir[4] = y5;
dir[3] = y4 - 1;
dir[2] = y3 - 1;
dir[1] = y2 - 1;
dir[0] = y1 - 1;
sort(dir, dir + 5, greater());
a[4] = arr[dir[0]][dir[1]][dir[2]][dir[3]][dir[4]] + discount[4] * bookPrice;
}
if (y3 > 0)
{
dir[4] = y5;
dir[3] = y4;
dir[2] = y3 - 1;
dir[1] = y2 - 1;
dir[0] = y1 - 1;
sort(dir, dir + 5, greater());
a[3] = arr[dir[0]][dir[1]][dir[2]][dir[3]][dir[4]] + discount[3] * bookPrice;
}
if (y2 > 0)
{
dir[4] = y5;
dir[3] = y4;
dir[2] = y3;
dir[1] = y2 - 1;
dir[0] = y1 - 1;
sort(dir, dir + 5, greater());
a[2] = arr[dir[0]][dir[1]][dir[2]][dir[3]][dir[4]] + discount[2] * bookPrice;
}
if (y1 > 0)
{
dir[4] = y5;
dir[3] = y4;
dir[2] = y3;
dir[1] = y2;
dir[0] = y1 - 1;
sort(dir, dir + 5, greater());
a[1] = arr[dir[0]][dir[1]][dir[2]][dir[3]][dir[4]] + discount[1] * bookPrice;
}
for (int i = 0; i < sizeof(a) / sizeof(double); i++)
{
if ((minDis[y1][y2][y3][y4][y5] > a[i] && a[i]) || minDis[y1][y2][y3][y4][y5] == 0)
minDis[y1][y2][y3][y4][y5] = a[i];//将折扣最大的(即数字最小,但不为0的元素记录在minDIs中)
}
arr[y1][y2][y3][y4][y5] = minDis[y1][y2][y3][y4][y5];//将minDis赋值给arr[y1][y2][y3][y4][y5],下一轮继续使用
}
}
}
}
}
printf("当前购买书本可享有最低的价格为:%.2f", minDis[book[1]][book[2]][book[3]][book[4]][book[5]]);//书本享有的总优惠*书本价格*书本数目/书本数目=书本享有总优惠*书本价格
cout << endl;
system("pause");
return 0;
}
---------------------
作者:朱超迪
来源:CSDN
原文:https://blog.csdn.net/q623702748/article/details/51592427
版权声明:本文为博主原创文章,转载请附上博文链接!
买书动态规划java_《编程之美》买书问题——动态规划相关推荐
- 编程之美——买书问题:贪心算法
1 问题描述及分析 买书折扣问题的描述是,某出版社的<哈里波特>系列共有5卷,每本单卖都是8块钱,如果读者一次购买不同的k(k>=2)卷,就可以享受不同的折扣优惠,如下所示: 问题是 ...
- [编程之美]买票找零(卡特兰数)
第一次看这题的时候没有好好注意,后来发现这是一类大问题,学习了卡特兰数这个概念,顺便又复习了高中的排列组合知识... 一.书中问题 先看一下书中引入卡特兰数的例子: <编程之美>4.3买票 ...
- 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题
http://blog.csdn.net/pipisorry/article/details/36380669 问题:下过中国象棋的朋友都知道,双方的"将"和"帅&quo ...
- 从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南
转自:从<编程之美>买票找零问题说起,娓娓道来卡特兰数--兼爬坑指南 引子: 大约两个月前,我在练习一些招聘的笔试题中,有一道和卡特兰数相关.那时还没来得及开始仔细看<编程之美> ...
- 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!
这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书." ...
- 读书问题之《编程之美》 -----12061161 赵梓皓
我阅读的书是<编程之美> 刚开始的时候阅读序,就觉得控制cpu利用率这个问题很好玩,所以重点看了这部分和解决办法,问题也都大部分是这部分的.那么问题就来了(挖掘机技术xxx?中国山东找蓝翔 ...
- 了结对编程和飞鸽传书
我这里谈的"是什么",不是谈的这两者的局域网聊天,因为局域网聊天大家搜索一下就知道了.而是这两者的本质意义.只有抓住了本质,你才会明白你为什么要采用这两种方式去编程,以及在实际运用 ...
- 《编程之美》 查找最大(小)的k个元素
http://blog.csdn.net/v_july_v/article/details/6370650 http://blog.csdn.net/insistgogo/article/detail ...
- 编程之美 1.6 买饮料问题
饮料供货 书中开始又是一堆看不懂的前述,感觉说了半天也没说清楚题目,看了解法一才看明白. 题目:假设STC共提供n中饮料,用(Si ,Vi,Ci,Hi,Bi )(对应的是饮料的名字,容量,可能的最大数 ...
- 编程之美 - 读书笔记 - 卖书折扣问题的贪心解法
<编程之美>读书笔记(四):卖书折扣问题的贪心解法 每 次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话 ...
最新文章
- R语言的一个加法函数
- TensorFlow | 使用Tensorflow带你实现MNIST手写字体识别
- HTML 取消超链接下划线
- types是什么意思中文翻译成_types 和 @types 是什么?
- python元胞转list_[Python练习向] 简易元胞自动机框架
- ZooKeeper学习第七期--ZooKeeper一致性原理
- Redis:15---键迁移(move、dump、restore、migrate)
- 我这么努力读个博士,难道只是为了进个高校拿5000每月的工资?
- 入门系列之在Ubuntu 16.04使用Buildbot建立持续集成系统
- Asp.Net 构架(HttpModule 介绍) - Part.3
- ModelForm views.py
- np.sum() | 不同维度的数组在不同轴方向上相加
- idea右边maven全爆红_通过Idea创建Spring Boot java项目
- 搞定 Linux Shell 文本处理工具,看完这篇集锦就够了
- 【POJ 2456】【二分答案】Aggressive cows(暑假 No.1)
- oa系统服务器到国外,oa系统放到云服务器云服务器
- 一张图解释清楚大数据技术架构,堪称阿里的核心机密
- java 文字串叠字检查_类似“又双叒叕”的字你认识多少?来看最全的叠字收录...
- 远程windows蓝屏解决办法
- N个鸡蛋放到M个篮子中
热门文章
- service $anchorScroll
- centos下svn和Apache的结合使用
- 如何进行Java EE性能测试与调优
- OpenCV-绘制旋转矩形
- VC6编辑直接采用Linux换行符,Tips: VC++篇
- Java语音怎么输出翼型_] 靠增大翼型弯度来获得升力增加的操纵面是什么?
- java 嵌入式 类型工具库_你常用的Java工具库都有哪些?
- java impliments,java基础英语---第九天
- 软件测试知识点 | Jmeter实现接口关联小结
- 让0基础纯小白也能上手写Python,干货分享(二)