加载中...

第三篇 贪心思想


说到“贪”字,很邪恶的一个词,记得和珅和大人拆解过这个字,为”今“和”贝“,而”贝“字分解成”上面的那个XX“和”人“,意思就是说

今天你贪了,明天一座监狱就把你套起来,纵观古今,有多少豪杰与"贪“结下了不解之缘,呵呵,扯远了。

 

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

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

一: 优点

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

耗费的时间。

 

二: 问题

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

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

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

 

三: 案例

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

的例子,比如我买了“康师傅来一桶方便面”,给了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("\n找给您的张数为:\n");
  17. foreach (var single in money)
  18. {
  19. if (single.Value != 0)
  20. {
  21. Console.WriteLine("{0}元\t{1}张\n", 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. }


还没有评论.