贪心算法并不贪婪(五)

Posted on 2018-10-25 19:51  时光top  阅读(339)  评论(0编辑  收藏  举报

一、贪心算法的思想

  贪心算法也称贪婪算法,此算法思想不从整体最优上考虑问题,仅是在某种意义上的局部最优求解。由此可见贪心算法只是追求某范围内的最优,可以将其称之为“温柔的贪婪”。

  贪心算法存在的问题:

  (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;
}

  实现结果:

 

Copyright © 2024 时光top
Powered by .NET 9.0 on Kubernetes