Python贪心算法

2020-12-31 07:26陈新龙
电脑报 2020年49期
关键词:币值面值收银员

陈新龙

所谓贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优加以考虑,它所做出的仅仅是在某种意义上的局部最优解。下面让我们来看一个经典的例题。

假设超市的收银柜中有1分、2分、5分、1角、2角、5角、1元的硬币。顾客结账如果需要找零钱时,收银员希望将最少的硬币数找出给顾客,那么,给定需要找的零钱数目,如何求得最少的硬币数呢?

这个找零钱的基本思路:每次都选择面值不超过需要找给顾客的钱最大面值的硬币。我们可以从面值最大的硬币开始,然后依次递减(图1)。

首先定义列表d存储已有币值。并且定义d_num存储每种币值的数量。通过循环遍历的方法计算出收银员拥有钱的总金额并保存在变量S中,要找的零钱变量为sum。

当找零的金額比收银员的总金额多时,无法进行找零,提示报错。要想用的钱币数量最少,我们从面值最大的币值开始遍历。这里也就是我们贪心算法的核心步骤。计算出每种硬币所需要的数量,不断地更新硬币个数与硬币面值,最终获得一个符合要求的组合(图2)。

贪心算法在对问题求解时,不是对所有问题都能得到整体最优解,也不是从整体上去考虑,做出的只是在某种意义上的局部最优解。从面值最大的硬币开始依次递减,寻找可用的方法。一般贪心算法并不能保证是最佳的解决方法,这是因为:总是从局部出发没有从整体考虑,只能确定某些问题是有解的,优点是算法简单。常用来解决求最大值或最小值的问题。

猜你喜欢
币值面值收银员
第一套人民币共有12种面值
在哪只手中
百万“大”钞
对人民币币值扭曲的研究与我国进行币值追赶的必要性
对人民币币值扭曲的研究与我国进行币值追赶的必要性
超市收银员
无名火
掉钱
欧洲央行不再发行500元面值欧元
小老鼠当收银员