《编程之美》1.4 买书问题 贪心法则
在书中,作者分析两种解法
解法一是贪心,最后得到的结论是:贪心不成立
解法二是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 问题描述及分析 买书折扣问题的描述是,某出版社的<哈里波特>系列共有5卷,每本单卖都是8块钱,如果读者一次购买不同的k(k>=2)卷,就可以享受不同的折扣优惠,如下所示: 问题是 ...
- 编程之美 - 读书笔记 - 卖书折扣问题的贪心解法
<编程之美>读书笔记(四):卖书折扣问题的贪心解法 每 次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话 ...
- 编程之美 1.6 买饮料问题
饮料供货 书中开始又是一堆看不懂的前述,感觉说了半天也没说清楚题目,看了解法一才看明白. 题目:假设STC共提供n中饮料,用(Si ,Vi,Ci,Hi,Bi )(对应的是饮料的名字,容量,可能的最大数 ...
- 面试难,应聘难,好工作,今安在?——《编程之美——微软技术面试心得》为你探路!即将上市,敬请关注!
这本书是我目前所见到的优秀面试试题的最全集,包含大量有趣且有启发性的题目,一方面对于学生的指导意义重大,另一方面,即使对于我们这些已经工作的人来说,也不失为一本充满智慧与趣味的好书." ...
- js算法:动态规划-金矿模型与买书问题(附js源码)
本文内容介绍转自博客:通过金矿模型介绍动态规划,后面附上我自己实现的js代码: 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个 ...
- 编程之美(六)饮料供货
在微软亚洲研究院上班,大家早上来的第一件事是干啥呢?查看邮件?NoNoNo,是去水房拿饮料:酸奶,豆浆,绿茶.王老吉.咖啡.可口可乐--(当然,还是有很多同事把拿饮料当做第二件事). 管理水房的阿姨们 ...
- 从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南
转自:从<编程之美>买票找零问题说起,娓娓道来卡特兰数--兼爬坑指南 引子: 大约两个月前,我在练习一些招聘的笔试题中,有一道和卡特兰数相关.那时还没来得及开始仔细看<编程之美> ...
- 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法
<编程之美>读书笔记(四):卖书折扣问题的贪心解法 每次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话, ...
- [编程之美]买票找零(卡特兰数)
第一次看这题的时候没有好好注意,后来发现这是一类大问题,学习了卡特兰数这个概念,顺便又复习了高中的排列组合知识... 一.书中问题 先看一下书中引入卡特兰数的例子: <编程之美>4.3买票 ...
最新文章
- eclipse 重启/打开内置浏览器
- javaweb项目开发日志的原理,方式
- 集成、知识蒸馏和自蒸馏有区别?
- C++回调机制的几种实现方式
- http://blog.csdn.net/myan/article/details/1906
- html 字幕飘动效果,html 滚动字幕 制作滚动字幕效果 参数
- android数字滚动动画,Android超简单实现金钱滚动效果
- Java CharArrayWriter size()方法与示例
- 笨方法“学习python笔记之循环
- EasyUI:Parser 解析器
- javaScript数据类型转换—显式转换(二)
- Extjs4.0 视频教程
- Mac M1 百度网盘客户端无法打开,网络连接不上
- java学生成绩管理系统(GUI界面+文件保存+排序)
- 腾讯php二面,【更新】腾讯实习生招聘后台开发面试一面+二面+HR面
- python xgboost建模过程_python - Dask中的XGBoost建模 - SO中文参考 - www.soinside.com
- Windows Sockets错误码方案
- 线上教学是计算机在什么方面的应用,浅谈线上线下混合式教学模式在计算机基础教学中应用...
- 手机从哈林子弹节省人力
- MPU6050加速度传感器学习笔记之传感器
热门文章
- TMail电子邮件,TMail放入服务器只需4分钟
- Response重定向
- java用面向对象写吃货联盟,火星车(面向对象思想编程)
- 集合高德地图搜索--导出Excel数据 工具
- 爬美女图的的脚本分享, 灯灯灯噔....
- Win8系统,装成win10系统的步骤
- 标准化(Normalization)
- thingsboard | thingsboard edge 删除设备 云端同步删除 thingsboard edge删除设备后 云端不删除设备
- 取苹果手机里面app的包名 ios app packagename
- 在html中加入外部css样式,如何引入CSS样式表?