贪心算法(c++)

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优解的策略,从而希望最终能够达到全局最优解的算法。贪心算法通常适用于求解最优化问题,它通过每一步的局部最优选择来构建全局最优解。

贪心算法的核心思想是通过局部最优解来推导全局最优解,它不会回溯或者重新考虑之前的选择。在每一步中,贪心算法根据某种规则或者评判准则做出当前最优的选择,并且不会对之前已经做出的选择进行修改。

贪心算法的一般流程如下:

  1. 定义问题的解空间,并且确定问题的初始解。
  2. 判断当前解是否满足问题的约束条件,如果满足则跳到步骤4;否则跳到步骤3。
  3. 根据问题的约束条件,调整当前解,得到一个新解。
  4. 判断当前解是否满足问题的目标函数,如果满足则返回当前解作为最优解;否则跳到步骤2。

需要注意的是,贪心算法并不适用于所有类型的问题。有些问题的最优解可能需要经过多次选择和回溯才能找到,贪心算法不能保证得到全局最优解。因此,在应用贪心算法时,需要对问题的特性和约束条件进行分析,确保贪心策略是可行且有效的。

贪心算法的优点是简单且高效,通常时间复杂度较低。它可以用于解决一些优化问题,例如活动选择问题、最小生成树、背包问题的部分等。然而,需要注意的是,贪心算法并不保证全局最优解的存在或者唯一性,因此在使用贪心算法时需要注意问题的性质和约束条件。

下面是用贪心算法来解决经典问题“找零问题”

#include <iostream>
#include <vector>

using namespace std;

vector<int> coinChange(int amount, vector<int>& coins) {
    vector<int> result;
    int n = coins.size();

    // 从最大面值的硬币开始
    for (int i = n - 1; i >= 0; i--) {
        // 尽可能多地使用当前面值的硬币
        while (amount >= coins[i]) {
            result.push_back(coins[i]);
            amount -= coins[i];
        }
    }

    // 如果无法凑出给定金额,返回空数组
    if (amount != 0) {
        result.clear();
    }

    return result;
}

int main() {
    int amount = 27;
    vector<int> coins = {1, 2, 5, 10, 20, 50};

    vector<int> result = coinChange(amount, coins);

    cout << "使用的最少硬币为:" << endl;
    for (int coin : result) {
        cout << coin << " ";
    }
    cout << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值