详解C++贪心算法

什么是贪心:

贪心算法是一种常见的算法思想,它通常用于求解优化问题。贪心算法的基本思想是每一步都选择当前最优的解决方案,最终得到全局最优解。

在 C++ 中,贪心算法的具体实现通常包括以下几个步骤:

  1. 问题建模:把问题表述成数学模型,明确问题的限制条件及目标函数。

  2. 排序:对于某些问题,需要对数据进行排序,以便更好地实现贪心策略。

  3. 贪心策略:根据问题的限制条件及目标函数,设计贪心策略,确定每一步的最优选择。

  4. 实现算法:根据贪心策略,编写算法代码。

例题

以下是一个简单的例子,展示了如何使用贪心算法求解一些问题:

例子:

有一个长度为 N 的数列 {a1, a2, ..., aN},从中选择 K 个数,使它们的和最大。每次选择时,只能从相邻的两个数中选择一个。求最大和。

解法:

根据题目要求,我们每次选择时只能选择相邻两个数中的一个,因此,选择的过程是一次一次的,每次选择都会对后面的选择产生影响。因此,我们需要找到一种合适的贪心策略,使得每次选择都是全局最优解。

具体步骤如下:

  1. 将数列中的数按照从大到小排序。

  2. 选择第一个数和第二个数中的最大值作为第一个选择。

  3. 从第三个数开始,每次选择当前数和前面已经选择的数中的最大值作为新的选择。

  4. 重复上述步骤,一共选择 K 个数。

  5. 将 K 个数的和作为答案输出。

code:

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100010;

int n, k;
int a[N];

int main()
{
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> a[i];

    sort(a, a + n);

    int res = 0;
    for (int i = n - 1; i > n - 1 - k; i--)
        res = max(res, a[i]);

    cout << res << endl;

    return 0;
}

时间复杂度:O(NlogN),排序需要 O(NlogN) 的时间,选择需要 O(K) 的时间。

空间复杂度:O(N),需要一个数组存放输入的数列。

贪心的优势和劣势

贪心算法的优势: 1.简单易懂:贪心算法通常比其他算法更容易理解和实现; 2.时间复杂度低:由于只需求解每一步最优解,因此时间复杂度往往比其他算法低; 3.适用性广:贪心算法可以应用于大量的问题中,例如霍夫曼编码、最短路径、背包问题等。

贪心算法的劣势: 1.不一定找到全局最优解:贪心算法只求每一步的最优解,不能保证找到全局最优解; 2.需要证明正确性:贪心算法需要证明每一步的贪心选择都是正确的,否则可能会得到错误的结果; 3.局限性较大:贪心算法只适用于某些特定类型的问题,对于复杂的问题,往往需要其他算法的辅助或替代。

贪心和动态规划的区别

C++贪心和动态规划是算法中常见的两种方法,它们都可以用来解决最优化问题,但是它们的实现和适用场景有所不同。

贪心算法的核心思想是在局部最优的情况下,得到全局的最优解。它通过局部最优解的累积来得到全局最优解,每一步都做出当前最优的选择,但是并不保证最终结果一定是最优的。贪心算法的实现简单,时间复杂度较低,适用于解决一些相对简单的问题,例如背包问题、最小生成树等。

而动态规划算法则是将一个问题分解成多个子问题,通过记忆化搜索来得到最优解。它通过子问题的解来得到原问题的解,需要用到递归或迭代来实现。动态规划算法的实现较为复杂,但是它可以得到全局最优解,适用于解决一些相对复杂的问题,例如最长公共子序列、最短路径等。

总之,贪心算法和动态规划算法都有自己的特点和适用场景,在实际应用中需要根据具体问题来选择合适的算法。

参考资料:

https://www.acwing.com/video/1496/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值