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

    这个贪心的行为在算法中也成为了一种指导思想,也就是说贪心算法所作出的选择在当时的环境下是最好的,说深一点就是它仅仅是某种

    意义上的局部最优解。但不一定是全局最优解,此时往往接近于最优解。

     

    一: 长处

         前面也说了,贪心仅仅是求的当前环境下的最优解。而不是追究总体的最优解,所以贪心就避免了为求的总体最优解而枚举各种方案所

    耗费的时间。

     

    二: 问题

         ① 不能保证贪心所得出的解是总体最优的。

         ② 不能用来求最大解和最小解问题。

         ③ 仅仅能求满足某些约束条件的可行解的范围。

     

    三: 案例

          事实上说到贪心,基本上都会提到“背包问题”,这里我就举一个“找零钱的问题“,对的,找零钱问题是我们生活中一个活生生的贪心算法

    的样例,比方我买了“康师傅来一桶方便面”,给了10两银子。方便面3.8两,那么收银mm该找我6.2两,现实中mm不自觉的就会用到贪心的行

    为给我找最少张币,总不能我给mm一张。mm给我十几张。那样mm会心疼的。

    此时mm提供的方案就是:5元1张,1元1张。2角1张。

    复制代码
     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace Tanxin
    7 {
    8 class Program
    9 {
    10 static void Main(string[] args)
    11 {
    12 while (true)
    13 {
    14 var money = Exchange(decimal.Parse(Console.ReadLine()));
    15
    16 Console.WriteLine(" 找给您的张数为: ");
    17 foreach (var single in money)
    18 {
    19 if (single.Value != 0)
    20 {
    21 Console.WriteLine("{0}元 {1}张 ", single.Key, single.Value);
    22 }
    23 }
    24 Console.WriteLine("--------------------------------------------------------------------");
    25 }
    26 }
    27
    28 /// <summary>
    29 /// 找零
    30 /// </summary>
    31 /// <param name="num"></param>
    32 static Dictionary<decimal, int> Exchange(decimal num)
    33 {
    34 var money = GetInit();
    35
    36 int i = 0;
    37
    38 while (true)
    39 {
    40 if (num < 0.05M)
    41 {
    42 return money;
    43 }
    44
    45 var max = money.Keys.ElementAt(i);
    46
    47 if (num >= max)
    48 {
    49 num = num - max;
    50
    51 //money的张数自增
    52 money[max] = money[max] + 1;
    53 }
    54 else
    55 {
    56 //假设是小于1毛,大于5分的情况下
    57 if (num < 0.1M && num >= 0.05M)
    58 {
    59 //按一毛计算
    60 money[0.10M] = money[0.10M] + 1;
    61
    62 num = 0.0M;
    63 }
    64 else
    65 {
    66 i++;
    67 }
    68 }
    69 }
    70 }
    71
    72 static Dictionary<decimal, int> GetInit()
    73 {
    74 Dictionary<decimal, int> money = new Dictionary<decimal, int>();
    75
    76 //key表示钱,value表示钱的张数
    77 money.Add(100.00M, 0);
    78 money.Add(50.00M, 0);
    79 money.Add(20.00M, 0);
    80 money.Add(10.00M, 0);
    81 money.Add(5.00M, 0);
    82 money.Add(2.00M, 0);
    83 money.Add(1.00M, 0);
    84 money.Add(0.50M, 0);
    85 money.Add(0.20M, 0);
    86 money.Add(0.10M, 0);
    87
    88 return money;
    89 }
    90 }
    91 }
    复制代码

  • 相关阅读:
    记一次centos7.2下用crontab执行定时任务的过程(初级)
    海外手机号码正则匹配
    装了wamp之后,80端口被占用解决办法
    newtonsoft动态修改JObject
    .net正则提取手机号码,并替换带有手机号码的a标签
    .vs目录有什么用?
    centos7安装nginx-1.13.6 新手入门,图文解析
    centos7安装kafka_2.11-1.0.0 新手入门
    centos7安装apache 新手入门 图文教程
    面向对象——案例练习(4)判断点是否在圆的内部
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6751755.html
Copyright © 2011-2022 走看看