1、分治算法
将原问题分解规模较小的、类似于原问题的子问题,【递归】地求解这些子问题,然后合并其解,建立原问题的解。
和动态规划有相似之处。
一般解决子问题相对独立的问题,子问题重叠的问题一般用动态规划解决。
2、动态规划
和分治算法类似,也是分解然后合并,最后得到解。
区别是:子问题重叠,动态规划会将其解存储起来,下次求解该子问题时,直接拿过来。
用动态规划能解决的问题,用分治算法肯定能解决,只是运行时间长了。
动态规划试图只解决每个子问题一次。
一旦某个给定子问题的解已经得到,则将其存储,下次需要直接查表取出。
3、贪心算法
使用场景:有一组数据,我们定义了限制值和期望值,希望从中选出一些数据,在满足限制值的情况下,期望值最大。
算法思想:每次选择时,在对限制值同等贡献情况下,选择对期望值贡献最大的数据;
如果数据的限制值均不等,其期望值也不等,则根据情况进行最优选择。
验证:举几个例子验证正确性。
注:贪心算法有时候对一些问题并不能给出最优解,必须得针对情况验证分析。
实战分析:
1、分糖果
我们有 m 个糖果和 n 个孩子。糖果少,孩子多,怎么把糖果分配给孩子。每个糖果的大小不等,这 m 个糖果大小分别是 s1, s2, s3, … , sm。除此之外,每个孩子对糖果大小的需要也不一样,假设这 n 个孩子对糖果大小的需要分别是g1, g2, g3, … ,gn。
如何分配,能满足最多数量的孩子????
思路:每次从孩子中,找到对糖果需求最小的,然后在糖果中,找到能满足他的最小的糖果,分给他。重复这样的操作
2、钱币找零
假设我们有1元、2元、5元、10元、20元、50元、100元面额的纸币,他们的张数分别是c1、