算法--贪心算法

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。

贪心算法的基本步骤如下:
1. 建立数学模型来描述问题。
2. 把问题分解为若干个子问题。
3. 对每个子问题求解,注意子问题的解可能被存储并供后面重复使用。
4. 把子问题的解组合成原问题的解。

贪心算法并不保证对所有问题都能得到最优解,但在某些问题上贪心策略却能得到最优解。

下面是一个用C语言实现的贪心算法示例,该算法用于解决找零问题,即给定一定数量的硬币和需要找零的金额,找出最少的硬币数量。


#include <stdio.h>

void minCoins(int coins[], int m, int V) {
    int table[V + 1];
    table[0] = 0;
    for (int i = 1; i <= V; i++)
        table[i] = INT_MAX;
    for (int i = 1; i <= V; i++) {
        for (int j = 0; j < m; j++)
          if (coins[j] <= i) {
              int sub_res = table[i - coins[j]];
              if (sub_res != INT_MAX && sub_res + 1 < table[i])
                  table[i] = sub_res + 1;
          }
    }
    printf("Minimum coins required is %d", table[V]);
}

int main() {
    int coins[] = {9, 6, 5, 1};
    int m = sizeof(coins)/sizeof(coins[0]);
    int V = 11;
    minCoins(coins, m, V);
    return 0;
}


在这个例子中,我们首先初始化一个大小为V+1的数组table,其中V是需要找零的金额。然后,对于每一个小于等于V的数i,我们尝试减去每一种硬币的面值,看看是否可以得到更少的硬币数量。如果可以,我们就更新table[i]的值。最后,table[V]就是我们要找的答案,即最少需要的硬币数量。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值