Live2D

贪心算法

贪心真的是个好东西呢

 


 

一,对贪心的了解

贪心算法是一种在求解问题的过程中,总是做出当前状态下的最优解的一种贪婪地做法,贪心算法使用于某些求可行性解和最优解的题目。

贪心算法与其说是一种算法,不如说是一种策略,其解题的方式是从问题的初始状态出发,经过若干次贪心选择而得到答案的一种策略。

贪心选择:应用同一规则,而后的每一步都是当前看似最佳的选择,且这种选择只依赖于已作出的选择,不依赖于未做出的选择。

贪心算法要满足的无后效性指的是每个状态只与自己当前有关,与前面无关,与后面无关,一般较为独立,这也是贪心算法与DP的区别,DP的无后效性指,当前状态的选择只依赖于当前状态分解为的两个较小的子问题与子问题以前的状态毫无关系,因为子问题的答案满足最优子结构,因此DP可以得到全局最优解,贪心的最优解答案比较独立,与前后都没什么大关系。

贪心策略的适用前提:局部最优策略能导致产生全局最优

贪心问题的一般解题步骤:

1,建立数学模型来描述问题

2,把求解的问题分解为若干个子问题

3,对每一个子问题求解,得到局部的最优解

4,把子问题的最优解合成原来解问题的一个解

 


 

二,贪心实例分析

1,对动态规划和贪心的区分

在N行M列的矩阵中,每次只能向上走一格或者向右走一格,现在要求从做下角出发到达右上角的路径和最大。

3 4 6
1 2 10

 

 

 

动态规划:当前状态的答案依赖于分解为的两个子问题即到达当前格子下面格子的最大路径和与到达当前格子左边格子的最大路径和,dp[i][j]=max(dp[i-1][j],dp[i][j+1])+a[i][j],就可求出全局最优解1-2-10-6

贪心策略:本体若适用于贪心策略的话,要使路径和最大贪心策略显然是每次选择右边或上边数较大的那个走,得到路径1-3-4-6,显然局部并不是最优,这个题不满足局部最优策略能导致产生全局最优,所以不适用于贪心算法。

2,部分的背包问题

给n个物品,第i个物品的重量为wi,选择尽量多的物品,是的总重量不超过C。

分析:这类背包问题与动态规划的贪心问题有许多的不同,动态规划的背包问题,每个物品都含有一个价值,要求所选价值最大,所以依赖于放这个物品之前体积的最有值,不适用于贪心。反观这道题,影响因素只有重量一个,要选择尽量多的物品,

贪心策略应当时选取尽量轻的物品,一件一件选择直到选不下为止,所以我们排个序就好了。

3,性价比类部分背包问题

有n个物品,第i个物品的重量为wi,价值为vi,在总重量不超过C的情况下让总价值尽量高,每个物品可以只取走一部分,价值和重量按比例计算。

分析:这是比较显然的一类性价比问题,题目中限制条件有两个,第一总重量不能超过C,第二选取的价值尽可能的大,因为这两个限制条件的综合限制,所以我们不可以优先选出价值最大的,也不可以优先选出重量最轻的,那应该如何贪心的选择呢,我们发现每个物品都有一个性价比,所以我们只需要求出每个物品的性价比并排序,在不超过C的情况下选取性价比较高得我物品即可。

 


 

三,贪心经典应用(整理于题解之中)

1,选择不相交区间问题

2,区间选点问题

3,区间覆盖问题

4,流水作业调度问题

5,带限期和罚款的单位时间任务调度

6,其他类贪心

posted @ 2019-08-13 08:14  Hoyoak  阅读(546)  评论(0编辑  收藏  举报