数据结构与算法 您所在的位置:网站首页 和倍问题的四种解法 数据结构与算法

数据结构与算法

2023-10-18 00:47| 来源: 网络整理| 查看: 265

文章目录 一、分治策略与递归算法1. 分治策略的概念2. 分治策略与递归算法的关系 二、优化问题和贪心策略1. 优化问题2. 贪心策略3. 贪心策略失效 三、找零问题的递归解法改进递归算法解决方案 四、找零问题的动态规划解法1. 动态规划解法2. 动态规划中最主要的思想3. 找零兑换:动态规划算法扩展

一、分治策略与递归算法 1. 分治策略的概念

分治策略是解决问题的典型策略:分而治之。将问题分为若干更小规模的部分通过解决每一个小规模部分问题,并将结果汇总得到原问题的解。

2. 分治策略与递归算法的关系

递归算法体现了分治策略: 问题解决依赖于若干缩小了规模的问题,汇总得到原问题的解。

应用相当广泛: 排序、查找、遍历、求值等等,都用到了分治策略,且大多都是由递归算法实现的。

二、优化问题和贪心策略 1. 优化问题

计算机科学中许多算法都是为了找到某些问题的最优解。我们很难计算出这些问题的最优解,只能不断的向这个最优解靠近。

一个经典案例是兑换最少个数的硬币问题:

假设你为一家自动售货机厂家编程序,自动售货机要每次找给顾客最少数量硬币; 假设某次顾客投进1美元的纸币,买了37美分的东西,要找63美分,那么最少数量就是:两个25分硬币、一个10分硬币和三个1分硬币,一共6个硬币。

2. 贪心策略

解决上面的找零问题,我们的第一反应通常是使用最直观的“贪心策略”。使用如下方法解决:

从面值最大的硬币开始,尽量找大面值的硬币,等剩余要找的钱不足一个该面值的硬币,再换面值小一点的找零,以此类推。

3. 贪心策略失效

还是找零问题,但这次硬币的面值除了上面的三种外,多了一种21美分的面值。

此时,如果还按照贪心策略,则需要 25 × 2 + 10 × 1 + 1 × 3 25 \times 2 + 10 \times 1 + 1 \times 3 25×2+10×1+1×3,总共六个硬币。因为,找完两个25美分后,剩下的13美分不足一个21美分硬币。所以,没有使用21美分硬币。

但如果一上来就使用21美分硬币,那么则只需要三个21美分硬币。

贪心策略最终失效了,没有给出最优解。

三、找零问题的递归解法

接下来的递归算法则弥补了贪心算法的不足,它可以百分之百的给出最优解。

首先是确定基本结束条件,兑换硬币这个问题最简单直接的情况就是,需要兑换的找零,其面值正好等于某种硬币。

如找零25分,答案就是1个硬币!

其次是减小问题的规模,我们要对每种硬币尝试1次,例如美元硬币体系:

找零减去1分后,求兑换硬币最少数量(递归调用 自身);找零减去5分后,求兑换硬币最少数量(递归调用 自身);找零减去10分后,求兑换硬币最少数量(递归调用 自身);找零减去25分(quarter)后,求兑换硬币最少数量(递归调用自身);

从上述4项中选择最小的一个。

python代码实现:

def recMC(coinValueList, change): """ 使用递归算法解决找零问题 :param coinValueList: 货币体系,是一个列表,保存硬币的各种面值 :param change: 找零的金额 :returns: 找零花费的最少硬币数量 """ # 初始化最少硬币数 minCoins = change # 递归出口:如果要找的金额恰好是某一个面值的硬币就返回1 if change in coinValueList: return 1 # 否则,从货币体系中选取一个面额,并且面额要比找零金额要小 else: for i in [c for c in coinValueList if c


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有