关于硬币问题能否贪心的证明

硬币问题是一个很经典的算法问题,对于给出面值不同的硬币,决定了是否可以直接通过贪心求解,比如1元2元5元就可以用优先取5的策略,而1元4元5元就不可以
那么这个问题为什么会出现不同,这就涉及到贪心算法的证明,很多时候我们往往不在意这些贪心的完整证明,只要大致没有反例,我们就直接应用,但闲来思考,发现了一些关于硬币问题贪心的证明方法
就比如硬币1 2 5,我们如果无论要构造多少的面值,都考虑5的构造方法,如果只有一个5就要用5个一或3个二或两个二一个1来达成而五以下的数分别要1 1 2 2张硬币才能凑到所以对于1-9的所有选法我们进行统计发现5到九的情况都是可以优先选5的,而在1-9之外的数一定是5的倍数,不用讨论。或者说6到九的部分都是选5的策略更优秀,实质上,这道题的贪心证法好像就是一种局部dp,只在1-2n-1中讨论问题对于所有类似问题都是一样14 5之所以不可行就是因为在n==8是不选5可以得到最优解。
在这里插入图片描述
这张图所说的其实就是这个意思,你少用的内枚五元需要用这些方式来弥补。在6到9的范围中两者比较发现用五的更有即可证明贪心的可行性

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
硬币兑换问题是一个经典的贪心算法问题贪心算法的思想是每次选择当前最优解,以期望最终得到全局最优解。对于硬币兑换问题,我们可以采用以下贪心策略: 1. 优先选择面值最大的硬币,直到无法再选为止。 2. 如果当前面值无法选,则选择下一个面值最大的硬币证明这个贪心策略的正确性,我们需要证明贪心策略产生的解一定是最优解。我们可以采用反证法来证明。 假设存在一个最优解,它的硬币组合不同于贪心策略产生的硬币组合。我们可以将这个最优解分为两部分:第一部分是与贪心策略相同的硬币组合,第二部分是不同于贪心策略的硬币组合。 我们可以发现,第一部分的硬币组合一定是最优解,因为它与贪心策略相同,而贪心策略是每次选择当前最优解。因此,第一部分的硬币组合一定是最优解。 对于第二部分的硬币组合,我们可以发现,它的总面值一定小于等于贪心策略产生的硬币组合的总面值。因为贪心策略是每次选择当前最优解,而第二部分的硬币组合不同于贪心策略,因此它的总面值一定小于等于贪心策略产生的硬币组合的总面值。 因此,我们可以得出结论:贪心策略产生的硬币组合一定是最优解。 以下是一个Python实现的例子: ```python def coin_change(coins, amount): coins.sort(reverse=True) # 按面值从大到小排序 res = 0 for coin in coins: if amount >= coin: res += amount // coin amount %= coin return res if amount == 0 else -1 # 如果无法兑换,则返回-1 coins = [25, 10, 5, 1] amount = 41 print(coin_change(coins, amount)) # 输出:5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值