这个贪心的行为在算法中也成为了一种指导思想,也就是说贪心算法所作出的选择在当时的环境下是最好的,说深一点就是它仅仅是某种
意义上的局部最优解。但不一定是全局最优解,此时往往接近于最优解。
一: 长处
前面也说了,贪心仅仅是求的当前环境下的最优解。而不是追究总体的最优解,所以贪心就避免了为求的总体最优解而枚举各种方案所
耗费的时间。
二: 问题
① 不能保证贪心所得出的解是总体最优的。
② 不能用来求最大解和最小解问题。
③ 仅仅能求满足某些约束条件的可行解的范围。
三: 案例
事实上说到贪心,基本上都会提到“背包问题”,这里我就举一个“找零钱的问题“,对的,找零钱问题是我们生活中一个活生生的贪心算法
的样例,比方我买了“康师傅来一桶方便面”,给了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 }