贪心算法(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]就是我们要找的答案,即最少需要的硬币数量。