贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
贪心算法有一道经典的分糖果的题目,我们今天就用Scratch来理解如何用贪心算法解决这个问题。
如图片上有4个小朋友,小朋友头上的数字代表需要吃的糖的满足度。下面有4颗糖,糖上的数字代表着对应的满足度。
需要使用贪心之前,我们第一步需要将小朋友和糖果的满足度进行按顺序排序。
将小朋友对糖果的满足度建立数组S[ ],糖果的满足度为数组C[ ]。
此时我们开始对比,第一个小朋友对糖果的满足度s[0]=3,而糖果1的满足度为c[0]=2。
而c[0]>s[0]不成立,即糖果1的满足度不能够满足小朋友1的满足度,我们由此便能知道,糖果1的满足度定然不能满足后面的小朋友,所以我们就可以将糖果1丢弃。
这时我们看糖果2的满足度为6,c[1]=6.而小朋友1的满足度为s[0]=3。c[1]>s[0],即糖果2能够满足小朋友1的满足度需求,便将糖果2分给小朋友1吃。
因为小朋友1已经分到了糖果,所以我们不用再给小朋友1分糖果。接下来便是给小朋友2分糖果。小朋友2对糖果的满足度s[1]=5,而糖果3提供的满足度c[2]=8。c[2]>s[1],即糖果3能够满足小朋友2的满足度需求,便将糖果3分给小朋友2吃。
最后还剩下1个糖果,c[3]=21。小朋友3对糖果的满足度为s[2]=11。c[3]>s[2],
即糖果4能够满足小朋友3的满足度需求,便将糖果4分给小朋友3吃。
由此,因为糖果已经分完了,所以分糖果结束,我们的糖果能够满足3位小朋友的需求。