贪心算法
定义:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑。他所做出的是在某种意义上的局部最优解。
算法特点(通常):1.随着算法的进行,讲积累起其他两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包括已经被考虑过但被抛弃的候选对象。
2.有一个函数来检查候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。
3.另一个函数来检查是否一个候选对象的集合是可行的,也即是否可能在该集合上添加更多的候选对象以获得一解。
4.选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
5.最后,目标函数给出解得值。
贪心算法的实现框架
从问题的某一初始解出发;
while (能朝给定总目标前进一步)
{
利用可行的决策,求出可行解的一个解元素;
}
由所有解元素组合成问题的一个可行解;
例如:for(i=0; i<s; i++)
scanf("%d%d",&a[i].v,&a[i].w);
sort(a,a+s,cmp);
例:设有n个正整数,将他们链接成一排,组成一个最大的多位整数,例如n=3时,三个整数,13,312,343,连成的最大整数为:34331213
输入:n
n个数
输出:连成的多位数
算法分析:此题很容易想到使用贪心算法,正确的贪心标准是:先把整数化成字符串,然后在比较a+b和b+a,如果a+b>b+a,就把a排在b的前面,反之则把a排在b的后面。
贪心算法的选择可以依赖于以往所作出的选择,但绝不依赖于将来的选择,也不依赖于子问题的解。因此贪心算法与其他算法比有一定的速度优势。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。