贪心算法算法导论 找零问题

Posted 童话的守望者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法算法导论 找零问题相关的知识,希望对你有一定的参考价值。

考虑用最少的硬币找n美分零钱的问题。假设每种硬币的面额都是整数。

A.设计贪心算法求解找零问题,假定有25美分、10美分、5美分和1美分4种面额的硬币。证明你的算法能找到最优解。

B.假定硬币的面额是c的幂,即面额c0,c1,...,ck,ck为整数,c>1,k>=1.证明:贪心算法总能得到最优解。

C.设计一组硬币面额,使得贪心算法不能保证得到最优解。这组硬币面额中应该包含1美分,使得对每个零钱值都存在找零方案。

D.设计一个O(nk)时间的找零算法,适用于任何k种不同面额的硬币,假定问题包含1美分硬币。

A:

分析——

引理1(离散数学其及应用3.1.4):若n是正整数,则用25美分、10美分、5美分和1美分等尽可能少的硬币找出的n美分零钱中,至多有2个10美分、至多有1个5美分、至多有4个1美分硬币,而不能有2个10美分和1个5美分硬币。用10美分、5美分和1美分硬币找出的零钱不能超过24美分。

证用反证法。证明如果有超过规定数目的各种类型的硬币,就可以用等值的数目更少的硬币来替换。注意,如果有3个10美分硬币,就可以换成1个25美分和1个5美分硬币;如果有2个5美分硬币,就可以换成1个10美分硬币;如果有5个1美分硬币,就可以换成1个5美分硬币;如果有2个10美分和1个5美分硬币,就可以换成1个25美分硬币。由于至多可以有2个10美分、1个5美分和4个1美分硬币,而不能有2个10美分和1个5美分硬币,所以当用尽可能少的硬币找n美分零钱时,24美分就是用10美分、5美分和1美分硬币能找出的最大值。

假设存在正整数n,使得有办法将25美分、10美分、5美分和1美分硬币用少于贪心算法所求出的硬币去找n美分零钱。首先注意,在这种找n美分零钱的最优方式中使用25美分硬币的个数q′,一定等于贪心算法所用25美分硬币的个数。为说明这一点,注意贪心算法使用尽可能多的25美分硬币,所以q′≤q。但是q′也不能小于q。假如q′小于q,需要在这种最优方式中用10美分、5美分和1美分硬币至少找出25美分零钱。而根据引理1,这是不可能的。由于在找零钱的这两种方式中一定有同样多的25美分硬币,所以在这两种方式中10美分、5美分和1美分硬币的总值一定相等,并且这些硬币的总值不超过24美分。10美分硬币的个数一定相等,因为贪心算法使用尽可能多的10美分硬币。而根据引理1,当使用尽可能少的硬币找零钱时,至多使用1个5分硬币和4个1分硬币,所以在找零钱的最优方式中也使用尽可能多的10美分硬币。类似地,5美分硬币的个数相等;最终,1美分的个数相等。

B:

分析——同A题,由于1+c1+c2+c3+...ck-1=ck - 1<ck,故当n大于ck时,可以分解为ck与n-ck的值,其中ck只用一个硬币值为ck的硬币就能得到最少硬币数,而子问题变成n-ck的最少硬币数,依次类推,贪心算法总能得到最好的结果。

   C:

分析——要分析什么情况下贪心算法无效,如果出现一组硬币25,6,5,1.由于1+5=6,当遇到10元时,按照贪心算法将分解为6+4*1,而其实为2*5.

D:

动态规划算法很适合。

以上是关于贪心算法算法导论 找零问题的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法:柠檬水找零

贪心算法结构与算法分析:C语言描述

硬币找零问题的动态规划实现

入门级贪心算法——java实现

贪心算法之找零问题

贪心算法之硬币找零