一、贪心算法的思想
贪心算法也称贪婪算法,此算法思想不从整体最优上考虑问题,仅是在某种意义上的局部最优求解。由此可见贪心算法只是追求某范围内的最优,可以将其称之为“温柔的贪婪”。
贪心算法存在的问题:
(1)不能保证最后的解是最优的;(2)不能用来求最大或最小解的问题;(3)只能求满足某些约束条件的可行解的范围;
贪心算法的基本思路如下所示:
(1)建立数学模型来描述问题;(2)对每一个子问题分成若干子问题;(3)对每一个子问题求解,得到子问题的局部是最优解;(4)把子问题的局部最优解合并成原来问题的一个解。
实现该算法的基本过程如下所示:
(1)从问题的某一初始解触发;(2)while能向给定总目标前进一步;(3)求出可行解的一个解元素;(4)由所有解元素组合成问题的一个可行解。
二、实例演练
“”找零钱”方案问题
算法思想:人民币有100、50、10、5、2、1、0.5、0.2、0.1等多种面额(单位为元)。在找零钱时有多种方案,例如零钱68.9元,至少有以下3种方案:
(1)1张20、4张10、1张5、3张1、1张0.5、4张0.1;(2)2张20、2张10、1张5、3张1、1张0.5、4张0.1;(3)6张10、1张5、3张1、1张0.5、4张0.1。
代码实现:
#include "stdio.h" #define MAXN 9 int parvalue[MAXN] = { 10000, 5000, 2000, 1000, 500, 100, 50, 10 }; int num[MAXN] = { 0 }; int exchange(int n); int main() { int i; float m; printf("输入需要找零金额:"); scanf("%f", &m); exchange((int)100 * m); printf("\n%.2f元零钱的组成:\n", m); for (i = 0; i < MAXN;i++) { if (num[i]>0) { printf("%6.2f:%d张\n", (float)parvalue[i] / 100.0, num[i]); } } system("pause"); return 0; } int exchange(int n) { int i, j; for (i = 0; i < MAXN;i++) { if (n>parvalue[i]) { break;//找到比n小的最大面额 } } while (n>0&&i<MAXN) { if (n>=parvalue[i]) { n -= parvalue[i]; num[i]++; } else if (n < 10&&n>=5) { num[MAXN - 1]++; break; } else { i++; } } return 0; }
实现结果: