实现这个算法是学习算法分析与设计这门课程的需要。
贪心算法是所接触到的第一类算法。算法从局部的最优出发,简单而快捷。对于一个问
题的最
优解只能用穷举法得到时,用贪心法是寻找问题次优解的较好算法。
贪心法是一种改进了的分级处理方法。用贪心法设计算法的特点是一步一步地进行,根
据某个
优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优
解。每一
步只考虑一个数据,它的选取应满足局部优化条件。若下一个数据与部分最优解连在一起
不再是可
行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。
这种能够
得到某种度量意义下的最优解的分级处理方法称为贪心法。
选择能产生问题最优解的最优度量标准是使用贪心法的核心问题。
假定有 n 个物体和一个背包,物体 i 有质量 wi,价值为 pi,而背包的载荷能力为 M。若
将物体 i 的
一部分 xi(1<=i<=n,0<=xi<=1)装入背包中,则有价值 pi*xi。在约束条件
(w1*x1+w2*x2+…………+wn*xn)<=M 下使目标(p1*x1+p2*x2+……+pn*xn)达到极大,此
处
0<=xi<=1,pi>0,1<=i<=n.这个问题称为背包问题(Knapsack problem)。
要想得到最优解,就要在效益增长和背包容量消耗两者之间寻找平衡。也就是说,总应
该把那
些单位效益最高的物体先放入背包。
在实现算法的程序中,实现算法的核心程序倒没碰到很大的问题,然而实现寻找最优度
量标准
程序时麻烦不断!
在寻找最优度量标准时,大致方向是用冒泡排序算法。也就是根据 p[i]/w[i]的大小来对
w[i]来
排序。
在直接用此算法时,可以有如下的一段代码:
//根据效益 tempArray[i]对重量 w[i]排序,为进入贪心算法作准备
1void sort(float tempArray[], flaot w[], int n)
2{
3int i = 0, j = 0;
4int index = 0;
5
6//用类似冒泡排序算法,根据效益 p[i]/w[i]对 w[i]排序
7for (i = 0; i < n; i++)
8{
9float swapMemory = 0;
10float temp;
11
12temp = tempArray[i];
13index = i;