贪心算法
什么是贪心算法
贪心算法是指在求解问题的时候,总是做出当前看来最好的决定,而不考虑将来的后果。一般来说这将导致局部最优,当算法终止时,我们希望达到全局最优。如果这样算法就是正确的,否则算法得到了一个次优解。
贪心算法的特性
贪心算法采用自顶向下,用迭代的方法做出贪心选择,没做一次选择,都将问题分解为规模更小的子问题。通过对子问题再做贪心,得到问题的最优解。能够用贪心解决的问题要具备两个性质:贪心选择性质和最优子结构性质。
* 贪心选择性质:问题整体最优解可以由一系列局部最优的选择来达到。要证明一个问题是否具有贪心选择性质,就要证明每一步的贪心选择最终导致问题的整体最优。
* 最优子结构性质:一个问题的最优解包含子问题的最优解。
贪心算法解决问题的一般步骤
- 建立数学模型来描述问题。
- 把求解的问题分成若干个子问题。
- 对每一子问题求解,得到子问题的局部最优解。
- 把子问题的解局部最优解合成原来解问题的一个解。
算法的过程:
从问题的某一初始解出发;
while (能朝给定总目标前进一步)
{
求出可行解的一个解元素;
}
最后,由所有解元素组合成问题的一个可行解。
贪心举例:最优装载问题
/*
问题描述:有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。
最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
求解过程:要想装的多,那么就先装重量小的。先对集装箱的重量排序,然后装到轮船上
*/
#include <stdio.h>
#include <stdlib.h>
//qsot用
int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
/*
box : 排序后的重量
w : 能够承载的重量
n : 集装箱的总数
*/
void loading(int *box, int w, int n)
{
for (int i = 0; i < n; ++i)
{
if (w - box[i] >= 0)
{
w -= box[i];
printf("%d ", box[i]);
}
}
printf("\n");
}
int main()
{
int w = 100;
int box[6] = { 80,20,25,30,10,20 };
qsort(box, 6, sizeof(box[0]), cmp);
loading(box, w, 6);
return 0;
}