买书问题

买书问题(动态规划DP)C++源代码 题目:买书 有一书店引进了一套书,共有3卷,每卷书定价是60元,书店为了搞促销,推出一个活动,活动如下: 如果单独购买其中一卷,那么可以打9.5折。 如果同时购买两卷不同的,那么可以打9折。 如果同时购买三卷不同的,那么可以打8.5折。 如果小明希望购买第1卷x本,第2卷y本,第3卷z本,那么至少需要多少钱呢?(x、y、z为三个已知整数)。 立即下载

一、问题:

买书问题:

      上柜的《哈利波特》平装本系列,一共有五卷。假设每一卷单独销售均需8欧元。如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多。假设具体折扣的情况如下:

        本数    2       折扣   5%

        本数    3       折扣  10%

        本数    4       折扣  20%

        本数    5       折扣  25% 

问题:设计出算法,能够计算出读者所购买的一批书的最低价格。

二、分析

注意此题的关键点在两个地方:首先题目要求我们的折扣需要不同的书,比如两本卷一是不能使用折扣的;其次我们注意当买的书较多的时候会出现不同的组合情况,我们的目的就是求出哪一种组合情况最省钱。

三、解法一贪心算法

贪心算法指的就是我们每次先去看能不能使用五本折扣的,如果不能再去寻找四本折扣的,一次类推。
但是书中给出的情况也说明了,这样的话,当书的情况是(2,2,2,1,1)的时候采用贪心算法的话采用的是5,3进行折扣,但是这种折扣不如4,4的折扣。
虽然书中最后还给出了其改进的算法,但是到最后还是没有进行证明改进后的算法一定是最优的。
所以本文对贪心算法也不再进行赘述。

四、动态规划

1.问题中等价性

我们假设用Xn表示购买第n卷的的数量,那么我们用(X1,X2,X3,X4,X5)表示购买五种书的数量。我们用F(X1,X2,X3,X4,X5)表示购买这些书需要花费的最少费用。那么我们不难看出:F(X1,X2,X3,X4,X5)=F(X2,X1,X3,X4,X5),原因是各卷书的价格都是一样的,打折的要求和每一本书的种类是没关系的,只需要不同卷就行。
那么我们下面来把购书的这个向量进行更改一下,我们首先把X1,X2,X3,X4,X5从大到小进行排序,我们把排序的结果用Y1>=Y2>=Y3>=Y4>=Y5来进行表示。
那么由于上面的等价性我们知道F(X1,X2,X3,X4,X5)= F(Y1,Y2,Y3,Y4,Y5)的,我们为什么要进行这样的转换呢?接着往下看。

     2.动态规划

假设我们要买的书是(Y1,Y2,Y3,Y4,Y5),如果第一次我们考虑的是为五本不同的书进行付款(要求Y5>=1),也就是五种书分别减一就行了,我们好像并没有别的选择了。
那么假设我们第一次考虑的是为四本不同的书进行付款呢?那么我们就有可能有如下的购买集合:
(Y1-1,Y2-1,Y3-1,Y4-1,Y5)此时我们要求Y4>=1,注意书上没有写要求,但是我认为下面的四个组合要求Y5>=1

(Y1-1,Y2-1,Y3-1,Y4,Y5-1)

(Y1-1,Y2-1,Y3,Y4-1,Y5-1)

(Y1-1,Y2,Y3-1,Y4-1,Y5-1)

(Y1,Y2-1,Y3-1,Y4-1,Y5-1)
既然有这五种的购买集合,那么我们用哪一种的购买方式比较好呢?
直觉上,好像第一种购买方式可能比较好,原因是什么呢?第一种购买方式之后,好像留下最多的后续组合,我们举个例子,假设我们的购买书的向量是
(2,2,2,2,1),那么如果采用上面的第一种购买组个我们剩余的是(1,1,1,1,1)这样接下来可以直接选择五本的折扣,如果我们选择第二种的购买方式,余下的组合是:
(1,1,1,2,0),这样接下来我们的购买方式智能分解为(1,1,1,1,0)和(0,0,0,1,0),直觉告诉我们如果我们要准备选择4本的折扣的时候,尽量紧着数目多种类的书选,这样对不对呢?是不是要选择三本书,两本书进行折扣的时候都是按照这样的原则就能找到最优解呢?接下来我们证明。
书上给出的证明方式真的很巧妙,不得不服啊。
假设:如果在(Y1,Y2,Y3,Y4,Y5)的情况下选择扣除(1,1,1,0,1)能够得到最优解,此时剩下的组合是(Y1-1,Y2-1,Y3-1,Y4,Y5-1)。
    注意:这只是假设,不要迷糊了。
那么在这个假设的基础上,我们如果能够证明,采用扣除(1,1,1,1,0)也同样能够得到最优解,那么我们就可以说每次按照(1,1,1,1,0)就行了。
注意这句话的理解:为什么?举个例子吧,如果商家A和商家B同时卖一种商品,商家B说了,我卖的价格一定不会比A高,意思也就是说A卖多少,我至少会和他相等,或者小于他。同样的道理用到我们的题目中,采用方案二扣除的方式如果能够找到最优解的话,我们的方案一也一定能够找到最优解,结果是什么,我的方案一一定不会比方案二差。假设这个定理我们已经证明过了(注意是假设,我们会在后续把它证明了),你用同样的道理去比较方案三和方案二,你说加入方案三能够找到最优解,那么我的方案二也一定能够找到最优解,一次类推,最后你会发现其实方案一是最好的。
下面我们来证明:
从选择扣除四本书的组合来看,目前选择扣除方式是(1,1,1,0,1),由于Y4>=Y5那么显然在剩余的情况(Y1-1,Y2-1,Y3-1,Y4,Y5-1)中,Y4>Y5-1,则在
(Y1-1,Y2-1,Y3-1,Y4,Y5-1)的最优解中一定存在某些组合仅有Y4,没有Y5.
举个例子:注意书中给出了这样的例子Y1=Y2=Y3=Y4=Y5,我认为举这样的例子不太恰当,我后面再给出解释,我们先看书上的证明

假设Y1=Y2=Y3=Y4=Y5=2,选择(1,1,1,1,0)的话我们就会得到(1,1,1,1,2),那么剩下的书的序号就是{1,2,3,4,5,5}.
选择(1,1,1,0,1)的话我们就会得到(1,1,1,2,1),那么剩下的书的序号就是{1,2,3,4,4,5},由于Y4>Y5-1,则在(Y1-1,Y2-1,Y3-1,Y4,Y5-1)的最优解中一定存在某些组合仅有Y4,没有Y5,我们来看(Y1-1,Y2-1,Y3-1,Y4,Y5-1)的可能折扣方案:
{1,2,3,4,5} {4}
{1,2,3,4}   {4,5}
{1,2,4}        {3,4,5}
........
不管在哪个方案中都会出现一定有4而没有5的情况
{1,2,3,4,5} {4} 中的{4}
{1,2,3,4}   {4,5}中的{1,2,3,4}
{1,2,4}       {3,4,5}中的{1,2,4}
其实你仔细看会发现,如果我们把由第4本书而没有第5本书的组合里面的4换成5之后,是什么呢?就是我们如果最初采用(1,1,1,1,0)之后的可能的折扣方案。
{1,2,3,4,5} {4}——>{1,2,3,4,5} {5}
{1,2,3,4,}   {4,5}——>{1,2,3,5}   {4,5}
{1,2,4}        {3,4,5}——>{1,2,5}        {3,4,5}
这说明什么?这说明我们的方案二的最优解都能转化为方案一的最优解,这样的话,我们上面已经讨论过,这样我们就可以只是使用方案一来进行扣除了,因为他是最好的。
那么接下来我来说说为什么书上举这个例子是不太好的,Y1=Y2=Y3=Y4=Y5=2,他举的这个例子让人容易产生错觉,太巧了,为什么Y4要等于Y5呢,大于的时候会出现什么?大于的时候这个定理还成立吗?接下来我们进行讨论
当(Y1,Y2,Y3,Y4,Y5)为(2,2,2,2,1)的时候。
如果我们采用方案二扣除,得出的是(1,1,1,2,0),它剩余了{1,2,3,4,4}那么它之后的可能的方案是:
{1,2,3,4}  {4}
{1,2,4}  {3,4}
{1,3,4}  {2,4}
.......
那么我们如果采用第一种扣除方案的时候呢?得出的是(1,1,1,1,1),它剩余了{1,2,3,4,5},它之后的可能的方案是什么呢?
{1,2,3,4}  {5}
{1,2,4}  {3,5}
{1,3,4}  {2,5}

........

发现没有,你和上面进行对比,同样是可以转化的。

所以说无论是Y4=Y5,还是Y4>Y5,都是满足的。

这样我们就可以证明了方案一是最好的。

也就是说我们在进行扣除的时候,无论我们准备要扣除四个,三个,还是两个,紧着数目多的书进行扣除就一定能找到最优解。

下面给出书中的伪代码:

F(Y1,Y2,Y3,Y4,Y5)
  = 0 if (Y1=Y2=Y3=Y4=Y5=0)
  = min

       {
  5*8*(1-0.25)+F(Y1-1,Y2-1,Y3-1,Y4-1,Y5-1), if (Y5>=1)
  4*8*(1-0.20)+F(Y1-1,Y2-1,Y3-1,Y4-1,Y5), if (Y4>=1)
  3*8*(1-0.10)+F(Y1-1,Y2-1,Y3-1,Y4,Y5), if (Y3>=1)
  2*8*(1-0.05)+F(Y1-1,Y2-1,Y3,Y4,Y5), if (Y2>=1)
  8+F(Y1-1,Y2,Y3,Y4,Y5), if (Y1>=1)
  }

注意一点:我们每次进行扣除后,都要对剩下的书再次进行从大到小的排序。

例:
  F(1,2,2,2,1)
  = min{
  5*8*(1-0.25)+F(0,1,1,1,0),
  4*8*(1-0.20)+F(0,1,1,1,1),
  3*8*(1-0.10)+F(0,1,1,2,1),
  2*8*(1-0.05)+F(0,1,2,2,1),
  8+F(0,2,2,2,1),
  }
  注意下面这一步就是再次进行从大到小的排序
  = min{
  5*8*(1-0.25)+F(1,1,1,0,0),
  4*8*(1-0.20)+F(1,1,1,1,0),
  3*8*(1-0.10)+F(2,1,1,1,0),
  2*8*(1-0.05)+F(2,2,1,1,0),
  8+F(2,2,2,1,0),
  }

再解释下这个代码的过程,它其实就是一个穷举的过程,采用递归的方式,不过每次递归的时候都采用当前来说最好的扣除方案,不过具体扣除几个它都进行了穷举,最后把穷举的结果比较,看那个花费的少就返回哪个值,其实这个和上一个问题的烙饼的那个问题有点像。

代码就不贴了,网上很多,时间太紧了,我要赶紧去学机器学习了。

GEE案例教程:融合Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据,构建完整的洪水监测与影响评估工作流 本文介绍了一个专为巴基斯坦哈扎拉分区设计的洪水监测系统,该系统整合了Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据等多源遥感数据。系统通过VV极化SAR数据的水体提取算法(阈值-13dB)实现洪水范围监测,结合10米分辨率的光学影像进行可视化验证,并利用100米分辨率人口数据评估受灾人口。系统提供完整的技术实现,包括研究区加载、遥感数据处理、日期选择界面和洪水变化检测等功能模块,为灾害应急响应提供科学依据。 阅读详情

相关推荐

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

编程之美 1.4 买书问题

买书问题         题目:在节假日的时候,一般书店都会做促销,假设一套书共有5册,没册书的定价都是相同的30元,店家为了促销推出了一个方案,具体如下:     &nbsp

ShaYx1991的博客 743

ESP32蓝牙广播数据自定义指南:让你的设备更容易被手机发现

本文详细介绍了如何通过自定义ESP32蓝牙广播数据提升设备在手机端的可发现性。从广播数据结构、扫描响应优化到跨平台兼容性设置,提供了全面的技术指南和实战代码示例,帮助开发者解决智能硬件开发中的蓝牙连接难题。

weixin_29172201的博客 271

递归——买书问题

买书问题 描述 小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。 问小明有多少种买书方案?(每种书可购买多本) 输入 一个整数 n,代表总共钱数。(0 <= n <= 1000) 输出 一个整数,代表选择方案种数 样例输入 样例输入1: 20 样例输入2: 15 样例输入3: 0 样例输出 样例输出1: 2 样例输出2: ...

eck_燃的博客 1784

YOLO详解

本文参考知乎 https://zhuanlan.zhihu.com/p/25236464 1. YOLO的创新点 YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。 从网络设计上,YOLO与two steps的目标检测方法如RCNN、Fast RCNN和Faster RCNN的区别如下: YOLO训练和检测均是在一个单独网...

UnknownPlayer的博客 9944

<视觉>——单目相机的标定(简单原理+Opencv实现)

单目相机的标定原理大致如下: 世界坐标到像素坐标的转换。 期间的参数有S尺度因子,内参矩阵K,旋转矩阵R,平移矩阵T,一共八个未知数。 在Opencv中我们可以方便的根据相机拍摄不同位姿的标定板图片来标定相机,从而求得这些参数,从而可以将相机下的坐标和实际的世界坐标联系起来,求取单应性矩阵H 参考: 单目相机综述:写的特别好 https://www.cnblo...

Kano365的博客 1万+

“买书问题”的贪心算法证明!

BOPGroup的专栏 3397

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 330

编程之美之买书问题

拿到这个问题,我的第一反应是用贪心算法,优先满足不同种类多的,这样打的折扣比价多。但是,看了书中的分析发现,*我们设定的贪心策略实际上是有问题的, ie 在买 5 + 3 本的时候会出错。 看到这里,书上说可以利用改进的贪心算法,感觉如果换了相应的折扣数量,可能又会有不同的结果了。因而,没有深入的研究下去。 既然,贪心算法不可行,那就用动态规划呗。 这里的动态规划思路很简单不过写起来有些复杂。

zhyh1435589631的专栏 1164

JVM高频面试基本问题与知识点整理

JVM高频面试基本问题与知识点整理

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 87万+

JAVA:Spring Boot 集成 Baidu UID-Generator ID 生成器

百度UID-Generator是一款高性能分布式ID生成器,支持600万QPS,提供Snowflake扩展版和Cache模式两种实现方式。文章详细介绍了如何在Spring Boot项目中集成该组件,包括Maven依赖配置、MySQL表结构初始化、Spring Boot数据源配置、WorkerId分配策略实现以及UID生成器的核心配置。该方案具有无中心依赖、ID单调递增、支持集群部署等特点,适用于订单号、用户ID等分布式场景。通过缓存模式(Cache-Buffer)可进一步提升性能,满足高并发业务需求。

木头 487

1.4节:买书问题

heyan2006的专栏 1042

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

每日一题(18)——买书问题(动态规划)

一,问题       上柜的《哈利波特》平装本系列,一共有五卷。假设每一卷单独销售均需8欧元。如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多。假设具体折扣的情况如下:         本数    2       折扣   5%         本数    3       折扣  10%         本数    4       折扣  20%         本数

小熊不去实验室 2108

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

买书(完全背包问题)dp

选品不限次(受背包容量限制)背包问题。dp[0][0] dp[0] 也是一种方案可以选的话,dp[j]的方案再加上前面的方案。多了一种选品可能。

2401_87338545的博客 206

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

动态规划——买书问题

题目       有一书店引进了一套书,共有3卷,每卷书定价是60元,书店为了搞促销,推出一个活动,活动如下:               如果单独购买其中一卷,那么可以打9.5折。        如果同时购买两卷不同的,那么可以打9折。        如果同时购买三卷不同的,那么可以打8.5折。               如果小明希望购买第1卷x本,第2卷y本,第3卷z本,那么至少需要多少钱...

皮蛋瘦肉没有肉 698

买书问题的动态规划实现

#---*--- 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

啦啦啦,德玛西亚 4231

Bailian4040 买书问题【Ad Hoc】

4040:买书问题 总时间限制: 1000ms 内存限制: 65536kB 描述 某网上书店举行优惠促销,现有两种优惠策略。策略一是购书总额大于100元的可享受免费送货。策略二是如果购书数量大于3本,则购书总额享受95折优惠(不包括运费)。两种优惠策略不能同时享受,最多可选择其中一种优惠策略。运费为20元。小明想在这个网站上买书,请帮他选择最优的优惠策略。 输入 有多行,第一行是买书的种类N(0 ...

海岛Blog 717

编程之美读书笔记_1.4 买书问题

1.4 买书问题  ㈠ 简要说明感觉写的很乱,这里先做个简单的说明。对于共有m种书进行打折,总共要买n本。先将原来的折扣,转换成相对折扣(=最大折扣-原折扣)。用F(n)表示买n本书时,能得到最小相对折扣值,此时原折扣和=n*最大折扣-F(n),必然最大。显然,F(m)=0。贪心算法要能成立,就是要证明F(n)=F(n-m),或者找出, F(n)=F(n-m)在什么条件下才成立。如

flyinghearts的专栏 2107

第1章 游戏之乐——买书问题

买书问题 1. 问题描述   上柜的《哈利波特》平装本系列,一共有五卷。假设每一卷单独销售均需8欧元。如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多。假设具体折扣的情况如下:   问题:要求根据这样的需求,设计出算法,能够计算出读者所购买一批书的最低价格。 2. 问题分析: 优化问题一般采用动态规划、贪心算法、分支限界这些思路进行,直到找到最优解!! ...

weixin_30610755的博客 82

《编程之美》之买书问题

   这两天刚看《编程之美》,里面的一些算法有些确实经典,非常的感兴趣,很喜欢自己先思考一下,然后看看书上的解析。对于1.4节的买书的问题,原书的解法二我看得不是很明白,而且解法一通过局部最优解得到全局最优解,这个肯定是不可取的,以下是我个人对这个问题的解法。   原问题,上柜的《哈利波特》平装本系列,一共有五卷。假设每一卷单独销售均需8欧元。如果读者一次购买不同的两卷,就可以扣除5%的费用,

yuner027的专栏 675

1023. 买书(完全背包方案数恰好问题)

小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。问小明有多少种买书方案?(每种书可购买多本)输入格式 一个整数 n,代表总共钱数。输出格式 一个整数,代表选择方案种数。数据范围 0≤n≤1000 输入样例1: 20 输出样例1: 2 输入样例2: 15 输出样例2: 0 输入样例3: 0 输出样例3: 1...

厚积而薄发 462
上一篇: 一摞烙饼的排序
下一篇: 快速找出故障机器
云金
博客等级 码龄11年 11粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值