贪心算法详解

这篇具有很好参考价值的文章主要介绍了贪心算法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

贪心算法

贪心算法(Greedy Algorithm)是一种常用的算法设计思想,用于解决最优化问题。贪心算法的基本思想是通过每一步的局部最优选择来达到全局最优解。

在贪心算法中,我们从问题的初始状态开始,通过每一步的选择来逐步构建解决方案,直到达到最终目标。在每一步中,贪心算法选择当前最优的解决方案,而不考虑该选择可能对未来步骤的影响。这种局部最优选择的累积最终希望能够达到全局最优解。

贪心算法的关键在于如何定义局部最优解,并证明通过每一步选择局部最优解最终可以达到全局最优解。如果可以确保通过贪心选择得到的解决方案是全局最优的,那么贪心算法通常是一种高效的求解方法,因为其简单性和高效性。

然而,贪心算法并不适用于所有问题,因为在某些情况下,贪心选择可能导致局部最优解无法达到全局最优解。因此,在使用贪心算法解决问题时,需要仔细分析问题的特性,并验证贪心选择是否能够得到正确的解。

总之,贪心算法是一种基于局部最优选择的算法设计思想,适用于一些特定的最优化问题。通过每一步选择当前最优解决方案,贪心算法希望能够达到全局最优解。然而,在使用贪心算法时需要谨慎分析问题,并验证其正确性。

找零问题

目标:找零钱币数量最少

贪心思路:每一步尽可能用大的面额

# 目标:找零钱币数量最少
def fun(t, n):
    """
    :param t: 钱币的面额
    :param n: 需要找零的钱
    :return:
    """
    m = [0 for _ in t]
    for i, money in enumerate(t):
        m[i] = n // t[i]
        n = n % t[i]
    return m, n  # 最后输出的n为剩余找零的余额

# 面额
t = [100, 50, 20, 10, 5, 1]
print(fun(t, 376))
# 输出结果为:([3, 1, 1, 0, 1, 1], 0)

背包问题

分数背包

问题:如何在有限的容量中装入价值最贵的商品,设商品可以任意切分。

贪心思路:每次把单位价值最大的东西先放进背包

goods = [(60, 10), (100, 20), (120, 30)]
goods.sort(key=lambda x: x[0] / x[1], reverse=True)  # 先按照单位价值最高排序 

def fraction_backpack(goods, w):
    m = [0 for _ in range(len(goods))]
    total_v = 0
    for i, (prize, wight) in enumerate(goods):
        if wight <= w:
            m[i] = 1
            w -= wight
            total_v += prize
        else:
            m[i] = w / wight
            w = 0
            total_v += prize * m[i]
            break
    return m, total_v

print(fraction_backpack(goods, 50))
# ([1, 1, 0.6666666666666666], 240.0)

数字拼接问题

问题:给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

贪心思路:每次两个组合,把能组成更大元素的放在前面。

用冒泡排序

def largestNumber(nums):
    n = len(nums)
    # ()map(function, iterable) 返回一个迭代器
    #
    # > function -- 函数
    # > iterable -- 序列
    nums = list(map(str, nums))
    # 冒泡排序,每次比较后把小的往后丢
    for i in range(n - 1):
        for j in range(n - i - 1):
            if nums[j] + nums[j + 1] < nums[j + 1] + nums[j]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]

    return str(int("".join(nums)))

nums = [3, 30, 34, 5, 9]

print(largestNumber(nums))

用自带排序函数

from functools import cmp_to_key
def largestNumber(nums):
    def cmp(x, y):
        return 1 if x + y > y + x else -1

    nums = list(map(str, nums))
    nums.sort(key=cmp_to_key(cmp), reverse=True)
    res = str(int("".join(nums)))
    return res

活动选择问题

问题:如何尽可能多安排活动?

贪心思路:每次都选择最早结束的活动文章来源地址https://www.toymoban.com/news/detail-502098.html

activities = [(1, 4), (3, 5), (0, 6), (5, 7), (5, 9), (6, 10), (8, 11), (8, 12), (12, 16)]

activities.sort(key=lambda x: x[1])


def fuc(activities):
    res = [activities[0]]
    for i in range(1, len(activities)):
        if activities[i][0] >= res[-1][1]:
            res.append(activities[i])
    return res


print(fuc(activities))

到了这里,关于贪心算法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 贪心算法详解

    贪心算法(Greedy Algorithm)是一种常用的算法设计思想,用于解决最优化问题。贪心算法的基本思想是通过每一步的局部最优选择来达到全局最优解。 在贪心算法中,我们从问题的初始状态开始,通过每一步的选择来逐步构建解决方案,直到达到最终目标。在每一步中,贪心

    2024年02月11日
    浏览(18)
  • 背包问题算法全解析:动态规划和贪心算法详解

    计算机背包问题是动态规划算法中的经典问题。本文将从理论和实践两个方面深入探讨计算机背包问题,并通过实际案例分析,帮助读者更好地理解和应用该问题。 背包问题是一种经典的优化问题。有的时候我们需要将有一堆不同重量或者体积的物品放入背包,但是背包容量

    2024年02月09日
    浏览(39)
  • “算法详解”系列第3卷贪心算法和动态规划出版

    “算法详解”系列图书共有4卷,目前1到3卷已经出版。最新出版的是第3卷—贪心算法和动态规划。 “算法详解”系列图书共有4卷,本书是第3卷—贪心算法和动态规划。其中贪心算法主要包括调度、最小生成树、集群、哈夫曼编码等,动态规划主要包括背包、序列对齐、最短

    2024年02月13日
    浏览(26)
  • Java贪心算法逻辑讲解及代码详解

    贪心算法是一种自顶向下的算法思想,它通过局部最优的选择来实现全局最优的解决方案。贪心算法的底层逻辑和代码实现如下: 确定问题的贪心策略:贪心策略是指在每个阶段选择最优解,从而实现全局最优解。 将问题转换为贪心算法可解决的形式:将问题描述转化为一

    2024年02月07日
    浏览(29)
  • c++—0/1背包问题--贪心算法(详解)

    贪心算法的基本思想 •贪心算法的特点是每个阶段所作的选择都是局部最优的,它期望通过所作的局部最优选择产生出一个全局最优解。 贪心与动态规划: 与动态规划不同的是,贪心是 鼠目寸光 ; 动态规划是 统揽全局 。 贪心:每个阶段产生的都是局部最优解 贪心算法的

    2024年02月04日
    浏览(35)
  • 【LeetCode 算法】Minimum Operations to Halve Array Sum 将数组和减半的最少操作次数-Greedy

    给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它 减小 到 恰好 一半 。(注意,在后续操作中你可以对减半过的数继续执行操作) 请你返回将 nums 数组和 至少 减少一半 的 最少 操作数。 1 = n u m s . l e n g t h = 1 0 5 1 = n u m s [ i ] = 1 0 7 1 = num

    2024年02月15日
    浏览(36)
  • Pytorch深度强化学习(3):详解K摇臂赌博机模型和ϵ-贪心算法

    本专栏重点介绍强化学习技术的数学原理,并且 采用Pytorch框架对常见的强化学习算法、案例进行实现 ,帮助读者理解并快速上手开发。同时,辅以各种机器学习、数据处理技术,扩充人工智能的底层知识。 🚀详情:

    2024年02月11日
    浏览(27)
  • Pytorch深度强化学习1-2:详解K摇臂赌博机模型和ϵ-贪心算法

    本专栏重点介绍强化学习技术的数学原理,并且 采用Pytorch框架对常见的强化学习算法、案例进行实现 ,帮助读者理解并快速上手开发。同时,辅以各种机器学习、数据处理技术,扩充人工智能的底层知识。 🚀详情:

    2024年02月11日
    浏览(34)
  • 强化学习基础:Epsilon-greedy 算法,多臂老虎机问题的理解,说点人话的强化学习,一定能看懂

    在强化学习中,epsilon-greedy可以说是非常基础的一个探索利用算法。应用十分广泛。尝试进行平衡的探索-利用方法。 在Epsilon-Greedy策略中,一个agent会以概率epsilon随机选择行动,也就是进行探索。此外以1-epsilon的概率选择当前估计的最佳行动,也就是利用 。 具体来说,如果

    2024年02月14日
    浏览(29)
  • 【LeetCode题目详解】第八章 贪心算法 part06 738.单调递增的数字 968.监控二叉树 (day37补)

    当且仅当每个相邻位数上的数字  x  和  y  满足  x = y  时,我们称这个整数是 单调递增 的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 109 # 暴力解法 题意很简单,那么首先想的就是暴力解法了,来我替大家

    2024年02月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包