算法之贪心思想
2015-07-20 20:48
363 查看
这个贪心的行为在算法中也成为了一种指导思想,也就是说贪心算法所作出的选择在当时的环境下是最好的,说深一点就是它只是某种
意义上的局部最优解,但不一定是全局最优解,此时往往接近于最优解。
一: 优点
前面也说了,贪心只是求的当前环境下的最优解,而不是追究整体的最优解,所以贪心就避免了为求的整体最优解而枚举各种方案所
耗费的时间。
二: 问题
① 不能保证贪心所得出的解是整体最优的。
② 不能用来求最大解和最小解问题。
③ 只能求满足某些约束条件的可行解的范围。
三: 案例
其实说到贪心,基本上都会提到“背包问题”,这里我就举一个“找零钱的问题“,对的,找零钱问题是我们生活中一个活生生的贪心算法
的例子,比如我买了“康师傅来一桶方便面”,给了10两银子,方便面3.8两,那么收银mm该找我6.2两,现实中mm不自觉的就会用到贪心的行
为给我找最少张币,总不能我给mm一张,mm给我十几张,那样mm会心疼的。
此时mm提供的方案就是:5元1张,1元1张,2角1张。
意义上的局部最优解,但不一定是全局最优解,此时往往接近于最优解。
一: 优点
前面也说了,贪心只是求的当前环境下的最优解,而不是追究整体的最优解,所以贪心就避免了为求的整体最优解而枚举各种方案所
耗费的时间。
二: 问题
① 不能保证贪心所得出的解是整体最优的。
② 不能用来求最大解和最小解问题。
③ 只能求满足某些约束条件的可行解的范围。
三: 案例
其实说到贪心,基本上都会提到“背包问题”,这里我就举一个“找零钱的问题“,对的,找零钱问题是我们生活中一个活生生的贪心算法
的例子,比如我买了“康师傅来一桶方便面”,给了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 }
相关文章推荐
- c++ memset 函数 及 坑
- CEF Xilium.CefGlue 防止浏览器闪退
- hdoj1090
- Android\Java 面试题
- 张珺 2015/07/06 个人文档
- Qt Creator中,include路径包含过程(或如何找到对应的头文件)
- 数据结构和设计模式03(排序)
- [Phonegap+Sencha Touch] 移动开发34 gem安装compass,不编译scss,怎么办?
- 蛮力_马和瓷砖
- LeetCode#155 Min Stack
- Vertica变化Local时间到GMT时间
- Redhat 账号的设置
- [LeetCode]Reverse Integer
- 百度地图自定义大头针
- 关于指令forward和form的使用
- 算法学习(开篇)
- hdu1280 前m大的数(数组下标排序)
- 摒弃一切杂念,奋发图强
- CoreData知识总结
- Android开发框架--AndroidAnnotations(一)