同学们好。在前面一节课,我们已经安装了Python,这节课我们来说说找零问题与贪心算法。#在讨论新的内容之前,我们先来回顾一下上一节课安排的课后小练习。同学们应该都会用小娜启动Python应用程序了吧。在小娜中输入Python并回车,小娜就会启动Python应用程序。

python找零钱代码 python找零钱问题_贪心算法

这是Python的应用程序界面,这节课我们先不讲如何编写Python程序。

我们先来看一个找零钱的问题,找零钱在我们的生活中经常用到,同学们一定也找过零钱给他人。

找零问题:现在假设有面值1角、2角、5角、10角(1元)的硬币各10枚,要求用最少的硬币数量来找零。

如何找1.3元的零钱?

找零钱就是把不同面值或同一面值的硬币组合起来,组合的面值等于需要找零的钱数。1.3元就是13角。下面有A、B、C三种组合方法:

A组合方法:1个10角的硬币、3个1角的硬币;

B组合方法:1个10角的硬币、1个2角的硬币、1个1角的1币;

C组合方法:2个5角的硬币、1个2角的硬币、1个1角的1币;

在上面的三种硬币面值组合中,A组合需要4个硬币、B组合需要3个硬币、C组合需要4个硬币。

显然,B组合是最优组合,也称为问题的最优解。感兴趣的同学有时间时可以进行更多种的组合,看看还有没有最优解。

问题的最优解

问题的最优解可以简单理解为符合人们预期或让人满意的问题解法。例如在找零问题中,人们的预期是用最少的硬币数找零,在A、B、C三种找零的解法中,B是符合预期的,因此B是最优解,A和C就不是最优解。在同一问题的解法中,有时最优解可能不止一个。例如外出旅行时,希望旅行预算在5000以内,因此5000以内的预算方案都是最优解,在这里我们就不再讨论了。

对比A、B、C三种组合,我们发现B组合在找零过程中,它首先选用面值最大的10角硬币1枚,由于5角硬币不满足组合要求(找零过程中硬币的组合面值不能大于找零的零钱数),它继续选用比5角硬币面值次之的2角硬币1枚(找零过程中硬币的组合面值不能大于找零的零钱数),最后选用比2角硬币面值次之的1角硬币1枚。

前面我们讨论的A、B、C三种找零组合,是在已经预知硬币面值和硬币数量的前提下,给出的找零1.3元的解决方法,解决方法也可以称为算法,硬币面值的组合过程也就是算法的过程。在找零问题中,我们可以把找零的解决方法称为找零算法。

小结一下,在A、B、C三种找零算法中,B找零算法是首先选择面值最大的硬币,然后再选择面值次之的硬币,依次类推直至硬币组合的面值等于零钱数。这种算法也称为贪心算法(也叫贪婪算法),贪心算法就是在解决问题的过程中,总是做出在当前看来是最好的选择。例如在找零过程中,B组合就是首先用最大面值的硬币,再依次选用面值次之的硬币。其实在生活当中,我们一直在使用贪心算法找零。

使用贪心算法找5.6元的零钱

使用贪心算法找5.6元的零钱的步骤如下:

(1)选择10角硬币5枚,面值总额为50角;

(2)选择5角硬币1枚,面值总额为55角;

(3)选择1角硬币1枚,面值总额为56角。

在找零问题中应用贪心算法,我们总能很快找到找零的最优解,找零5.6元仅需要7枚硬币即可。使用其它算法不会优于贪心算法给出的最优解,最优解就是使用最少的硬币数量来找零。感兴趣的同学们可以试一试,看看能不能找到比使用贪心算法更好的最优解。

课程小结

这节课我们主要讨论和学习了下面这些内容:

(1)如何启动Python应用程序

启动Python应用程序非常简单,只要在小娜输入框中输入“Python”,小娜就会为你找到与Python相关的应用程序,直接回车就可以启动Python应用程序了。

(2)什么是问题的最优解

问题的最优解是与人们预期相关的,人们对问题最满意的解法就是问题的最优解。举个容易理解的例子:在算数问题中,假设以算的快为人们满意的解法。那么,当求解从1开始一直加到10这个问题时,(1+10)*5的解法就是最优解,它显然要比1+2+3+4+5+6+7+9+10这么计算要快的多。

(3)什么是贪心算法

我们在生活中经常用到贪心算法,找零问题是典型的贪心算法。在找零过程中,我们总是先使用面值最大的零钱,然后再依次使用面值次之的零钱。贪心算法就是在解决问题的步骤中,每一个步骤都选择当前的最优解,不考虑整体。例如在吃饭过程中,假设最优解是吃好吃的,那么大多数人也在使用贪心算法。在一桌饭菜中,人们总是先吃掉最好吃的,然后再吃其次好吃的,等吃饱了就剩下不好吃的了。当然也有的人先吃不好吃的,最后吃好吃的,这就不是贪心算法了。

课后小练习

请同学们考虑一下。假设我们在找零过程中要求使用最多的硬币来找零,还能使用贪心算法吗?

假设有面值1角、2角、5角、10角(1元)的硬币各5枚,要求用最多的硬币数量来找零。该如何找1.3元的零钱?