为了账号安全,请及时绑定邮箱和手机立即绑定

算法洗脑系列(8篇)——第三篇 贪心思想

标签:
深度学习

   说到“贪”字,很邪恶的一个词,记得和珅和大人拆解过这个字,为”今“和”贝“,而”贝“字分解成”上面的那个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 }

复制代码

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消