贪心算法

本文介绍了贪心算法的概念及其在解决分数背包问题和Huffman编码中的应用。通过实例展示了如何利用贪心策略找到分数背包问题的最优解,并详细解释了Huffman编码的构建过程和其在数据压缩中的作用。
摘要由CSDN通过智能技术生成

贪心算法和动态规划有异曲同工之秒,能用贪心法的,就不用动规。我只想说,动态规划真TM难。

贪心算法这样一个算法,它在每一步都做出在当时看来是最优的方案,即它总是做出局部最优的选择。然后构成一个全局最优解。贪心算法也是一个强有力的算法,很多问题都能用贪心算法来解决。下面就说说两个经典的问题,分数背包问题和哈夫曼(Huffman)编码。

分数背包问题

分数背包问题是这样的,假设有一个背包体积为W, 有一系列商品,他们的体积各不相同,找出获取商品价值最大的方案。分数背包问题和0-1背包问题的惟一区别在于,是否可以取商品的一部分。贪心算法可以求解分数背包问题,但无法求解0-1背包问题。

正如贪心算法一样,人总是贪的,如果真有这样一件事,我们当然希望全部拿走,但是奈何空间有限。为简单起见,假设所有数据都是整数,该问题的输入和输出如下所述:


输入:
          第一行是一个整数m,表示商品的数量
          第二行是m个整数,表示商品的价值

输出:
          最大价值v


定义p = v / w,我们称之为性价比,很明显,我们当然应该取性价比最高的商品,即价值最高,体积最小。

比如一个体积为50的背包,有三件商品,体积和价值分别为

商品(i) 1 2 3
体积(v) 10 20 30
价值(w) 60 100 120
性价比(p) 6 5 4

所以我们先取商品1, 价值为60, 占10体积,还剩40体积,再取商品2,价值为100, 占20体积,还剩20体积,最后取20体积商品3,价值为4 * 20 = 80, 所以最优方案是60 + 100 + 80 = 240. 代码如下所示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Objcect {
    int c;
    int v;
    double p;
}Object;

int compare(const void* n1, const void* n2)
{
    return ((struct Objcect*)n2)->p - ((struct Objcect*)n1)->p;
}

int main(void)
{
    int m, w;

    while(scanf("%d", &m), m)
    {
        struct Objcect* objs = (struct Objcect*)malloc(sizeof(struct Objcect) * m);

        for(int i = 0; i != m;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值