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 }
    复制代码

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6751755.html
Copyright © 2011-2022 走看看