在书中,作者分析两种解法

解法一是贪心,最后得到的结论是:贪心不成立

解法二是dp , 也类似于递归,最后是成立的

在这里我们重点分析贪心法不成立的原因,以及如何改进

贪心法的适用有两个必要条件,即优化子结构和贪心选择性。优化子结构是成立的,在书中的解法二已经证明了。

对于贪心选择性:最基本的理解就是,每次选择当前最优的步骤,到最后就能得到整个问题的最优解法。我个人认为这只是贪心最基本的解释。

其实很多问题或者是算法都不是一成不变的,有时候,算法或思想是这样的,但我们可以在基本思想不变的情况下,根据题目进行一些改进或者是加入一些符合题目的条件(情况)。

对于买书这个折扣如下:

我们来看几个例子:

1、 2   2    2    1    1

这个例子我们可以这样分解:  1  1   1   1   1   +   1  1  1   0   0和 1  1   1  1  0 +  1  1  1  0  1

通过折扣的计算,我们可以得到这个的(1  1   1  1  0 +  1  1  1  0  1) 折扣更大。

2、2   2    1   1    0

这个例子我们可以这样分解:  1  1   1   1   0   +   1  1  0   0   0和 1  1   1  0  0 +  1  1  0  1  0

通过折扣的计算,我们可以得到这个的(1  1   1  1  0 +  1  1  0  0  0) 折扣更大。

3、2   1   1  0   0

这个例子我们可以这样分解:  1  1   1   0   0   +   1  0  0   0   0和 1  1   0  0  0 +  1  0  1  0  0

通过折扣的计算,我们可以得到这个的(1  1   1  0  0 +  1  0  0  0  0) 折扣更大。

有上面3个例子我们可以得到,就只有第一个例子不符合我们的贪心思想。

那我们是否能这样,其他情况我们都用贪心来解决,而第3个例子这种情况,我们就特殊处理

下面是我的代码:

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;int num[5];
int ze[5]; //保存每种折扣有多少个
double kou[4] = { 0.25, 0.2 , 0.1 , 0.05}; int main()
{while(1){int i , max_sum = 0 , j;for(i = 0; i < 5; i++){cin>>num[i];max_sum += num[i];ze[i] = 0;}double sum = 0;i = 0;for(i = 0; i < 5; i++) //i = 0 表示买5本 i = 1 表示买 4本 {sort(num , num+5);//重小到大的排序if(num[i] == 0)  continue; if(i == 2) //这就是特殊情况//对于特殊情况,我们是把它和 买5本情况 , 重新组合,变成 买两个 4本{int x = min(num[i] , ze[0]);ze[0] -= x;ze[i-1] += 2*x;ze[i] = num[i]-x;for(j = i+1; j < 5; j++)num[j] -= num[i];num[i] = 0;}else{ze[i] = num[i];for(j = i+1; j < 5; j++)num[j] -= num[i];num[i] = 0;}}sum = max_sum*8.0;for(i = 0; i < 4; i++){sum -= (5-i)*ze[i]*8*kou[i];}cout<<sum<<endl;
}return 0;
}

通过和书中第二个解法 , 进行的数据测试对比我们得到 , 这种变形的贪心解法是正确的。

具体的分析为什么是正确的 : 点击打开链接



《编程之美》1.4 买书问题 贪心法则相关推荐

  1. 编程之美——买书问题:贪心算法

    1 问题描述及分析 买书折扣问题的描述是,某出版社的<哈里波特>系列共有5卷,每本单卖都是8块钱,如果读者一次购买不同的k(k>=2)卷,就可以享受不同的折扣优惠,如下所示: 问题是 ...

  2. 编程之美 - 读书笔记 - 卖书折扣问题的贪心解法

    <编程之美>读书笔记(四):卖书折扣问题的贪心解法 每 次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话 ...

  3. 编程之美 1.6 买饮料问题

    饮料供货 书中开始又是一堆看不懂的前述,感觉说了半天也没说清楚题目,看了解法一才看明白. 题目:假设STC共提供n中饮料,用(Si ,Vi,Ci,Hi,Bi )(对应的是饮料的名字,容量,可能的最大数 ...

  4. 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!

    这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书."    ...

  5. js算法:动态规划-金矿模型与买书问题(附js源码)

    本文内容介绍转自博客:通过金矿模型介绍动态规划,后面附上我自己实现的js代码: 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个 ...

  6. 编程之美(六)饮料供货

    在微软亚洲研究院上班,大家早上来的第一件事是干啥呢?查看邮件?NoNoNo,是去水房拿饮料:酸奶,豆浆,绿茶.王老吉.咖啡.可口可乐--(当然,还是有很多同事把拿饮料当做第二件事). 管理水房的阿姨们 ...

  7. 从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南

    转自:从<编程之美>买票找零问题说起,娓娓道来卡特兰数--兼爬坑指南 引子: 大约两个月前,我在练习一些招聘的笔试题中,有一道和卡特兰数相关.那时还没来得及开始仔细看<编程之美> ...

  8. 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法

    <编程之美>读书笔记(四):卖书折扣问题的贪心解法 每次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话, ...

  9. [编程之美]买票找零(卡特兰数)

    第一次看这题的时候没有好好注意,后来发现这是一类大问题,学习了卡特兰数这个概念,顺便又复习了高中的排列组合知识... 一.书中问题 先看一下书中引入卡特兰数的例子: <编程之美>4.3买票 ...

最新文章

  1. eclipse 重启/打开内置浏览器
  2. javaweb项目开发日志的原理,方式
  3. 集成、知识蒸馏和自蒸馏有区别?
  4. C++回调机制的几种实现方式
  5. http://blog.csdn.net/myan/article/details/1906
  6. html 字幕飘动效果,html 滚动字幕 制作滚动字幕效果 参数
  7. android数字滚动动画,Android超简单实现金钱滚动效果
  8. Java CharArrayWriter size()方法与示例
  9. 笨方法“学习python笔记之循环
  10. EasyUI:Parser 解析器
  11. javaScript数据类型转换—显式转换(二)
  12. Extjs4.0 视频教程
  13. Mac M1 百度网盘客户端无法打开,网络连接不上
  14. java学生成绩管理系统(GUI界面+文件保存+排序)
  15. 腾讯php二面,【更新】腾讯实习生招聘后台开发面试一面+二面+HR面
  16. python xgboost建模过程_python - Dask中的XGBoost建模 - SO中文参考 - www.soinside.com
  17. Windows Sockets错误码方案
  18. 线上教学是计算机在什么方面的应用,浅谈线上线下混合式教学模式在计算机基础教学中应用...
  19. 手机从哈林子弹节省人力
  20. MPU6050加速度传感器学习笔记之传感器

热门文章

  1. TMail电子邮件,TMail放入服务器只需4分钟
  2. Response重定向
  3. java用面向对象写吃货联盟,火星车(面向对象思想编程)
  4. 集合高德地图搜索--导出Excel数据 工具
  5. 爬美女图的的脚本分享, 灯灯灯噔....
  6. Win8系统,装成win10系统的步骤
  7. 标准化(Normalization)
  8. thingsboard | thingsboard edge 删除设备 云端同步删除 thingsboard edge删除设备后 云端不删除设备
  9. 取苹果手机里面app的包名 ios app packagename
  10. 在html中加入外部css样式,如何引入CSS样式表?