A.pro读算法の1:贪心算法

1.1描述

  1. 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,也就是说,不从整体最优上加以考虑,所作出的仅是某种意义上的局部最优解。
  2. 贪心策略:在每个阶段,都作出一个按照某个评价函数最优的决策,这个评价函数最优称为贪心准则(类似于动态规划的状态转移方程)。
  3. 基本过程:在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解。
  4. 实用问题:局部最优策略能导致产生全局最优解。

1.2 性质

  1. 贪心选择性质:贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
  2. 最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质,问题的最优子结构性质是该问题可以用动态规划或者贪心算法求解的关键特征。

1.3 步骤

  1. 建立数学模型来描述问题;
  2. 把求解的问题分成若干个子问题;
  3. 对每一子问题求解,得到子问题的局部最优解;
  4. 把子问题的局部最优解合成原来问题的一个解。

1.4 实现框架

/* 
候选集合A:问题的最终解均取自于候选集合A。 
解集合S:解集合S不断扩展,直到构成满足问题的完整解。 
解决函数solution:检查解集合S是否构成问题的完整解。 
选择函数select:贪心策略,这是贪心算法的关键。 
可行函数feasible:解集合扩展后是否满足约束条件。 
*/  
Greedy(A)  
{  
    S={ };//初始解集合为空集  
    while (not solution(S))//集合S没有构成问题的一个解  
    {  
        x=select(A);//在候选集合A中做贪心选择  
        if feasible(S, x)//判断集合S中加入x后的解是否可行  
            S = S+{x};  
        A = A-{x};  
    }  
    return S;  
}  

2.1 贪心导论


2.2 实战演练

(#贪心 -1.1) [洛谷]P1223 排队接水 题解

(#贪心 -1.2) [洛谷]P1109 学生分组 题解

(#贪心 -1.3) [洛谷]P1094 纪念品分组 题解

(#贪心 -1.4) [洛谷]P2772 寻找平面上的极大点 题解

(#贪心 -1.5) [洛谷]P1106 删数问题 题解

(#贪心 -1.6) [洛谷]P2095 营养膳食 题解

(#贪心 -2.1) [洛谷]P2310 loidc,看看海 题解

(#贪心 -2.2) [洛谷]P1090 合并果子 题解


 

你可能感兴趣的:(贪心,导论,算法之路)