zoukankan      html  css  js  c++  java
  • 贪心算法

    在处理一个较为复杂的问题时,划分为若干个小问题,在每一次进行选择时,都作出当前子问题的最优解,并认为子问题合并后的整体也达到了最优解或者近似最优解。

    步骤:

           (1)建立数学模型来描述问题。
      (2)把求解的问题分成若干个子问题。
      (3)对每一子问题求解,得到子问题的局部最优解。
      (4)把子问题的局部最优解合成原来问题的一个解。

    示例

    题目描述:

    小明手中有 1,5,10,50,100 五种面额的纸币,每种纸币对应张数分别为 5,2,2,3,5 张。若小明需要支付 456 元,则需要多少张纸币?

    题目分析

    (1)建立数学模型
      设小明每次选择纸币面额为 Xi ,需要的纸币张数为 n 张,剩余待支付金额为 V ,则有:
    X1 + X2 + … + Xn = 456.
    (2)问题拆分为子问题
      小明选择纸币进行支付的过程,可以划分为 n 个子问题:即每个子问题对应为:
    在未超过 456 的前提下,在剩余的纸币中选择一张纸币。
    (3)制定贪心策略,求解子问题

    制定的贪心策略为:在允许的条件下选择面额最大的纸币。则整个求解过程如下:

    • 选取面值为 100 的纸币,则 X1 = 100, V = 456 - 100 = 356;

    • 继续选取面值为 100 的纸币,则 X2 = 100, V = 356 - 100 = 256;

    • 继续选取面值为 100 的纸币,则 X3 = 100, V = 256 - 100 = 156;

    • 继续选取面值为 100 的纸币,则 X4 = 100, V = 156 - 100 = 56;

    • 选取面值为 50 的纸币,则 X5 = 50, V = 56 - 50 = 6;

    • 选取面值为 5 的纸币,则 X6 = 5, V = 6 - 5 = 1;

    • 选取面值为 1 的纸币,则 X7 = 1, V = 1 - 1 = 0;求解结束

    (4)将所有解元素合并为原问题的解

    小明需要支付的纸币张数为 7 张,其中面值 100 元的 4 张,50 元 1 张,5 元 1 张,1 元 1 张。

    代码实现

    const int N = 5; 
    int Count[N] = {5,2,2,3,5};//每一张纸币的数量 
    int Value[N] = {1,5,10,50,100};
    int solve(int money) {
        int num = 0;
        for(int i = N-1;i>=0;i--) {
            int c = min(money/Value[i],Count[i]);//每一个所需要的张数 
            money = money-c*Value[i];
            num += c;//总张数 
        }
        if(money>0) num=-1;
        return num;
    }

    参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247485458&idx=2&sn=d4bf481c32798a62e44bf3fff577a141&chksm=fa0e6793cd79ee85ca8817826af20431eb451e51b83aa55497ba3b6dbe8d4a8de5d7b048a8fa&scene=21#wechat_redirect

  • 相关阅读:
    xhEditor struts2实现图片上传
    xhEditor入门基础
    jQuery全屏插件Textarea Fullscreen
    jQuery幻灯片插件Skippr
    jQuery跳房子插件hopscotch
    合理配置SQLSERVER内存
    浅谈SQL Server 对于内存的管理
    SQL Server 临时表和表变量系列之选择篇
    SQLTest系列之INSERT语句测试
    转:表变量与临时表的优缺点
  • 原文地址:https://www.cnblogs.com/xiuzhublog/p/12620003.html
Copyright © 2011-2022 走看看