贪心算法——出纳员算法

硬币挑战问题

问题描述:给定几类不同面值的硬币,每类硬币假设有无穷多枚。试给出一种策略,当我们给定一个数时,用上述几类面值的硬币,使这些硬币的总额等于该数且硬币总数尽可能的少。

贪心策略(出纳员算法):每次选取不超过剩余总数最大的硬币,直到选不出为止

在这里插入图片描述

算法说明

<1> 在存在可行解但最小面值大于1的情况下,出纳员算法可能会导致找不到可行解。如:
给定面值为{7,8,9},给定数为15,则
出纳员算法: 15 = 9 +?(导致解不可行)
最优策略:15 = 7 + 8

<2> 出纳员算法不是对任意给定面值的集合都是最优的(即使最小面额为1,最小面额为1只能保证出纳员算法有可行解,不能保证是最优解),只有在特定面值集合下是最优的(如:{1,5,10,25,100})
证明出纳员算法不是对任意给定面值的集合都是最优的
如给定面值集合:{1, 10, 21, 34, 70, 100, 350, 1225, 1500},给定数为140
出纳员算法:140 = 100 + 34 +1 +1 +1 +1 +1 +1(因为最小面额为1,一定有可行解)
最优策略:140 = 70 + 70

证明对于集合{1,5,10,25,100},出纳员算法能够得到最优解
首先我们有以下事实(最优解满足的特性):
①1面值硬币的数量不超过4,不然可以用1个5面值的硬币代替5个1面值的硬币
②5面值硬币数量不超过1,不然可以用1个10面值的硬币代替2个5面值的硬币
③25面值硬币数量不超过3,不然可以用1个100面值的硬币代替4个25面值的硬币
④5面值硬币和10面值硬币数量之和不能超过2
证明:首先由②知,5面值硬币数量不超过1,因此5面值硬币可以选择0个或1个
又选择0个5面值硬币时,3个10面值硬币可以被1个25面值硬币和1个5面值硬币代替(因为总数更少)
又选择1个5面值硬币时,加上2个10面值硬币可以被1个25面值硬币代替(因为总数更少)
所以④结论成立
在以上事实下,我们开始证明:
在这里插入图片描述
基于上述事实,我们可以得到上述表格第三列的约束条件
其中最右一列表示,在满足第三列约束且不用本行面值硬币的条件下,只用小于本行面值的一系列硬币所能得到的最大面额,都不会超过本行面值硬币的数值。
因此当剩余数 x x x, c k ≤ x ≤ c k + 1 c_k\leq x \leq c_{k+1} ckxck+1,一定会选择 c k c_k ck面值的硬币,否则只用小于 c k c_k ck时所用的硬币数量会大于用包含 c k c_k ck面值的一系列的硬币数量。
而出纳员算法就是当 c k ≤ x ≤ c k + 1 c_k\leq x \leq c_{k+1} ckxck+1时,选择 c k c_k ck面值的硬币,因此对于集合{1,5,10,25,100},出纳员算法能够得到最优解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值