算法导论习题解答 16-1 (找零问题)
考虑用最少的硬币找nnn美分零钱的问题。假定每种硬币的面额都是整数。
a. 设计贪心算法求解找零问题,假定有25美分、10美分、5美分和1美分4中面额的硬币。证明你的算法能找到最优解。
b. 假定硬币面额是ccc的幂,即面额为c0c^0c0,c1c^1c1,⋯\cdots⋯,ckc^kck,ccc和kkk为整数,c>1c > 1c>1,k≥1k \ge 1k≥1。证明:贪心算法总能得到最优解。
c. 设计一组硬币面额,使得贪心算法不能保证得到最优解。这组硬币面额中应该包含1美分,使得对每个零钱值都存在找零方案。
d. 设计一个O(nk)O(nk)O(nk)时间的找零算法,适用于任何kkk种不同面额的硬币,假定总是包含1美分硬币。
Answer:
a.
贪心算法:
设找零的硬币数量为mmm,那么找零的硬币序列为{i1,i2,⋯,im}\{i_1,i_2,\cdots,i_m\}{i1,i2,⋯,im},对于iri_rir的选取,采用如下规则:
ir=max{ci∣ci≤n−∑l=1r−1il}i_r = max\{c_i | c_i \le n - \sum_{l=1}^{r-1}i_l\}ir=max{ci∣ci≤n−l=1∑r−1il}
即每一个iri_rir都取尽可能大的面额,此处1≤r≤m1 \le r \le m1≤r≤m。下证该贪心算法的能够得到最优解。
取最优解中与贪心算法的找零序列{i1,i2,⋯,im}\{i_1,i_2,\cdots,i_m\}{i1,i2,⋯,im}从第一个元素起连续相同最长的最优解序列{j1,j2,⋯,jk}\{j_1,j_2,\cdots,j_k\}{j1,j2,⋯,jk},此处有k≤mk \le mk≤m。那么假设存在一个rrr它们满足当l≤rl \le rl≤r时,都有il=jli_l = j_lil=jl,而ir+1≠jr+1i_{r+1} \ne j_{r+1}ir+1=jr+1。对于这个情况我们有如下分析判断:
- 令n′=n−∑l=1riln' = n - \sum_{l=1}^{r}i_ln′=n−∑l=1ril。那么两个序列在第r+1r+1r+1个找零之前,剩余未找零的值都为n′n'n′。
- 由于贪心算法一定会选择最大的可选面额,故ir+1>jr+1i_{r+1} > j_{r+1}ir+1>jr+1。
- 在剩余的{jr+1,⋯,jk}\{j_{r+1},\cdots,j_k\}{jr+1,⋯,jk}中,若存在jl=ir+1j_l = i_{r+1}jl=ir+1,那么互换jr+1j_{r+1}jr+1和jlj_ljl,这样既不影响最优解的正确性,又使得调换后的新序列与贪心算法序列有更长的重复子序列。这与取出的最优解是最长的相同序列的假设不符。故在剩余的最优解子序列{jr+1,⋯,jk}\{j_{r+1},\cdots,j_k\}{jr+1,⋯,jk}中,任意jl≠ir+1j_l \ne i_{r+1}jl=ir+1。
- 在剩余的{jr+1,⋯,jk}\{j_{r+1},\cdots,j_k\}{jr+1,⋯,jk}中,若存在jl>ir+1j_l > i_{r+1}jl>ir+1,那么ir+1i_{r+1}ir+1就不是小于n′n'n′的最大可选面额,这与贪心算法定义矛盾。综合上一个结论,我们得以推断在剩余的最优解子序列{jr+1,⋯,jk}\{j_{r+1},\cdots,j_k\}{jr+1,⋯,jk}中,任意jl<ir+1j_l < i_{r+1}jl<ir+1。
- 在最优解序列中,面额5最多只有1个,否则可用面额10来代替。同理有面额1最多有4个;面额10最多两个;面额25数量不限。从而我们发现,只使用面额1的最优解,最多能表示4;只使用面额1、5的最优解,最多能表示9;只使用面额1、5、10的最优解,最多能表示24。即:在本题的币值中,不使用面额大于等于c的硬币就无法表示大于等于c的面额。
- 结合前两条结论,我们能推出:
ir+1>∑l=r+1kjli_{r+1} > \sum_{l=r+1}^{k}j_lir+1>l=r+1∑kjl
这与两者剩余的值都为n′n'n′相矛盾。
综上所述这样的rrr不存在,必然存在一个最优解序列与贪心算法的序列完全相同。证毕。
b.
这一题的分析过程与上一题基本相同,其中不同的地方在于面额。在本题的面额体系中,若最优解只使用{c0,⋯,cr}\{c^0,\cdots,c^r\}{c0,⋯,cr}就完成了表示,那么所表示的值不可能大于cr+1c^{r+1}cr+1。此处除了ckc^kck,每个币值的硬币在最优解中最多出现c−1c-1c−1个,因此若最优解只使用{c0,⋯,cr}\{c^0,\cdots,c^r\}{c0,⋯,cr}就完成了表示,那么所表示的值最大为
(c−1)∑i=1rci=cr+1−1<cr+1(c-1)\sum_{i=1}^{r}c^i = c^{r+1} - 1 < c^{r+1}(c−1)i=1∑rci=cr+1−1<cr+1
因此最终的结论也与上一题相同,可证明贪心算法能找到最优解。
c.
硬币面额为{1,3,4}\{1,3,4\}{1,3,4},这样在处理n=6n=6n=6的问题时,贪心算法的序列为{4,1,1}\{4,1,1\}{4,1,1},最优解为{3,3}\{3,3\}{3,3}。
d.
使用动态规划算法,利用数组元素DP[i]DP[i]DP[i]来记录处理n=in=in=i时所需最少硬币的数量。其中DP[0]=0DP[0] = 0DP[0]=0,表示数额为0时需要0个硬币。那么数组的更新方式为:
DP[i]=min(DP[i−cr]+1∣i−cr≥0,r=1,2,⋯,k)DP[i] = min\left( DP[i-c_r] + 1\quad |\quad i-c_r \ge 0, r = 1,2,\cdots,k \right)DP[i]=min(DP[i−cr]+1∣i−cr≥0,r=1,2,⋯,k)
这样每个DP[i]DP[i]DP[i]计算的时间复杂度为O(k)O(k)O(k),遍历DPDPDP的时间复杂度为O(n)O(n)O(n),总的时间复杂度为O(nk)O(nk)O(nk)。
算法导论习题解答 16-1 (找零问题)相关推荐
- Leetcode算法Java全解答--16. 最接近的三数之和
Leetcode算法Java全解答–16. 最接近的三数之和 文章目录 Leetcode算法Java全解答--16. 最接近的三数之和 题目 想法 结果 总结 代码 我的答案 暴力破解 滑动列表 大佬 ...
- 算法导论习题—主方法求渐进紧确界、递归树方法
算法导论习题-主方法求渐进紧确界.递归树方法 4.5-1 a. T(n)=2T(n/4)+1T ( n ) = 2 T ( n / 4 ) + 1T(n)=2T(n/4)+1 b. T(n)=2T(n ...
- Leetcode算法Java全解答--73. 矩阵置零
Leetcode算法Java全解答–73. 矩阵置零 文章目录 Leetcode算法Java全解答--73. 矩阵置零 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定 ...
- 数据结构与算法(python)递归:找零问题
参考自 MOOC数据结构与算法Python版 目录 一.什么是递归Recursion 1. 初识递归 1.1 数列求和 1.2 递归"三定律" 2. 递归的应用 2.1 任意进制转 ...
- 算法导论习题—二叉搜索树、红黑树、区间树
算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...
- 算法导论习题,思考题题解博主录
算法导论最好结合课后习题来看,以查漏补缺,检验自己对知识的掌握和理解水平 我在看的过程中,参考了以下博主的博客 http://blog.csdn.net/longhuihu?viewmode=cont ...
- 算法导论习题C.2-9答案
题目:你参加一个游戏.该游戏将奖品藏在了三个幕布之后.如果你选对了幕布,则可以赢得奖品.在你选择了一个幕布后,但是幕布还没有揭开之前,支持人会揭开另两个幕布中的一个空幕布(支持人知道哪个幕布后是空的) ...
- 《算法导论》第16章 贪心算法 个人笔记
第16章 贪心算法 16.1 活动选择问题 问题:假设有一个n个活动的集合S=a1,a2,...,anS={a_1,a_2,...,a_n},这些活动使用同一个资源,而这个资源在某个时刻只能供一个活动 ...
- 算法导论 习题24.2-4 amp; 24.3-6 单源最短路径问题
24.2-4:给出一个高效算法来统计邮箱无回路图中的全部路径数.分析所给出的算法. 24.3-6:设G=(V,E)为带权有向图,权函数W: E-> {0,1,....,W},其中W为某非负整数. ...
最新文章
- PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)
- react中使用create-react-app创建项目执行函数两次
- 实验结果报告与实验总结_教科版科学四年级上册实验报告
- 暴力求解——最大乘积 Maximum Product,UVa 11059
- c# 执行js的方法
- 1.5 案例:多项式曲线拟合的比较
- [转载红鱼儿]kbmmw 开发点滴:kbmMW在事务中批量执行SQL
- 数据库select语句详解
- 《万国觉醒》之游戏战报FreeMarker模板引擎实现
- 渐进记号 Asymptotic Notations-------geeksforgeeks 翻译
- 0. crash和kdump 死机问题解决-x86_64-基础知识
- Android:适配器刷新数据无效
- 本文是关于前端开发基本流程的分享
- c语言 楼盘查询系统,专业楼盘部模型
- _3_body_标签
- 抖音seo源码,抖音短视频SEO,SEO系统源码搭建
- linux一键克隆,使用shell一键克隆虚拟机
- 左旋肉碱溶液铁离子去除办法
- 基于jupyter notebook的python编程-----MNIST数据集的的定义及相关处理学习
- STAR建索引内存不够
热门文章
- 修改并编译OpenCV源码提升霍夫变换线检测效果
- 数据源(DataSource)是什么以及SpringBoot中数据源配置
- 2020大数据面试题真题总结(附答案)
- 计算机辅助教育的可行性和存在的问题,深化小课题研究的问题与对策探析——基于内容分析法...
- 计算机英语翻译 unit 1
- 用Three.js实现简单布局的3D房间
- 金蝶K3出入库单据制单日期误填到未来的日期,如何进行账务调整?
- xp3系统登录服务器错误,如何解决XP系统“HTTP 500 内部服务器错误”【组图】
- 实用的思维导图软件推荐:Focusplan Pro for Mac中文版
- 工资要达到多少,才能向银行贷款20万?