算法分析与设计C++ 第五章:贪心算法

贪心算法总是作出在当前看来最好的选择
贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。

思路

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

贪心策略适用的前提是:

  • 局部最优策略能导致产生全局最优解。
    实际上,贪心算法适用的情况很少。一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可以做出判断

贪心算法每一步必须满足一下条件:

1、可行的:即它必须满足问题的约束。

2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。

3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。

贪心算法的实现框架

从问题的某一初始解出发;

while (能朝给定总目标前进一步)

{ 

      利用可行的决策,求出可行解的一个解元素;

}

由所有解元素组合成问题的一个可行解;

例题

最优装载问题

有一批集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船(件数最多)。
采用重量最轻者先装的贪心选择策略

template<class Type>
void Loading(int x[],  Type w[], Type c, int n){
int *t = new int [n+1];
Sort(w, t, n);//t 存储的是按重量排好序的集装箱的序号
for (int i = 1; i <= n; i++) 
    x[i] = 0;
for (int i = 1; i <= n && w[t[i]] <= c; i++) {
	  x[t[i]] = 1; c - = w[t[i]];
}
}
原文地址:https://www.cnblogs.com/ZCWang/p/12507470.html