贪心算法

贪心算法

 什么是贪心算法

 贪心算法是指在求解问题的时候,总是做出当前看来最好的决定,而不考虑将来的后果。一般来说这将导致局部最优,当算法终止时,我们希望达到全局最优。如果这样算法就是正确的,否则算法得到了一个次优解。

贪心算法的特性

贪心算法采用自顶向下,用迭代的方法做出贪心选择,没做一次选择,都将问题分解为规模更小的子问题。通过对子问题再做贪心,得到问题的最优解。能够用贪心解决的问题要具备两个性质:贪心选择性质和最优子结构性质。
* 贪心选择性质:问题整体最优解可以由一系列局部最优的选择来达到。要证明一个问题是否具有贪心选择性质,就要证明每一步的贪心选择最终导致问题的整体最优。
* 最优子结构性质:一个问题的最优解包含子问题的最优解。

贪心算法解决问题的一般步骤
  1. 建立数学模型来描述问题。
  2. 把求解的问题分成若干个子问题。
  3. 对每一子问题求解,得到子问题的局部最优解。
  4. 把子问题的解局部最优解合成原来解问题的一个解。
算法的过程:

 从问题的某一初始解出发;
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值