考虑用最少的硬币找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−1​il​}

即每一个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=1r​il​。那么两个序列在第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∑k​jl​
    这与两者剩余的值都为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∑r​ci=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 (找零问题)相关推荐

  1. Leetcode算法Java全解答--16. 最接近的三数之和

    Leetcode算法Java全解答–16. 最接近的三数之和 文章目录 Leetcode算法Java全解答--16. 最接近的三数之和 题目 想法 结果 总结 代码 我的答案 暴力破解 滑动列表 大佬 ...

  2. 算法导论习题—主方法求渐进紧确界、递归树方法

    算法导论习题-主方法求渐进紧确界.递归树方法 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 ...

  3. Leetcode算法Java全解答--73. 矩阵置零

    Leetcode算法Java全解答–73. 矩阵置零 文章目录 Leetcode算法Java全解答--73. 矩阵置零 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定 ...

  4. 数据结构与算法(python)递归:找零问题

    参考自 MOOC数据结构与算法Python版 目录 一.什么是递归Recursion 1. 初识递归 1.1 数列求和 1.2 递归"三定律" 2. 递归的应用 2.1 任意进制转 ...

  5. 算法导论习题—二叉搜索树、红黑树、区间树

    算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...

  6. 算法导论习题,思考题题解博主录

    算法导论最好结合课后习题来看,以查漏补缺,检验自己对知识的掌握和理解水平 我在看的过程中,参考了以下博主的博客 http://blog.csdn.net/longhuihu?viewmode=cont ...

  7. 算法导论习题C.2-9答案

    题目:你参加一个游戏.该游戏将奖品藏在了三个幕布之后.如果你选对了幕布,则可以赢得奖品.在你选择了一个幕布后,但是幕布还没有揭开之前,支持人会揭开另两个幕布中的一个空幕布(支持人知道哪个幕布后是空的) ...

  8. 《算法导论》第16章 贪心算法 个人笔记

    第16章 贪心算法 16.1 活动选择问题 问题:假设有一个n个活动的集合S=a1,a2,...,anS={a_1,a_2,...,a_n},这些活动使用同一个资源,而这个资源在某个时刻只能供一个活动 ...

  9. 算法导论 习题24.2-4 amp; 24.3-6 单源最短路径问题

    24.2-4:给出一个高效算法来统计邮箱无回路图中的全部路径数.分析所给出的算法. 24.3-6:设G=(V,E)为带权有向图,权函数W: E-> {0,1,....,W},其中W为某非负整数. ...

最新文章

  1. PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)
  2. react中使用create-react-app创建项目执行函数两次
  3. 实验结果报告与实验总结_教科版科学四年级上册实验报告
  4. 暴力求解——最大乘积 Maximum Product,UVa 11059
  5. c# 执行js的方法
  6. 1.5 案例:多项式曲线拟合的比较
  7. [转载红鱼儿]kbmmw 开发点滴:kbmMW在事务中批量执行SQL
  8. 数据库select语句详解
  9. 《万国觉醒》之游戏战报FreeMarker模板引擎实现
  10. 渐进记号 Asymptotic Notations-------geeksforgeeks 翻译
  11. 0. crash和kdump 死机问题解决-x86_64-基础知识
  12. Android:适配器刷新数据无效
  13. 本文是关于前端开发基本流程的分享
  14. c语言 楼盘查询系统,专业楼盘部模型
  15. _3_body_标签
  16. 抖音seo源码,抖音短视频SEO,SEO系统源码搭建
  17. linux一键克隆,使用shell一键克隆虚拟机
  18. 左旋肉碱溶液铁离子去除办法
  19. 基于jupyter notebook的python编程-----MNIST数据集的的定义及相关处理学习
  20. STAR建索引内存不够

热门文章

  1. 修改并编译OpenCV源码提升霍夫变换线检测效果
  2. 数据源(DataSource)是什么以及SpringBoot中数据源配置
  3. 2020大数据面试题真题总结(附答案)
  4. 计算机辅助教育的可行性和存在的问题,深化小课题研究的问题与对策探析——基于内容分析法...
  5. 计算机英语翻译 unit 1
  6. 用Three.js实现简单布局的3D房间
  7. 金蝶K3出入库单据制单日期误填到未来的日期,如何进行账务调整?
  8. xp3系统登录服务器错误,如何解决XP系统“HTTP 500 内部服务器错误”【组图】
  9. 实用的思维导图软件推荐:Focusplan Pro for Mac中文版
  10. 工资要达到多少,才能向银行贷款20万?