算法洗脑系列(8篇)——第三篇 贪心思想
2012-05-03 14:36
176 查看
说到“贪”字,很邪恶的一个词,记得和珅和大人拆解过这个字,为”今“和”贝“,而”贝“字分解成”上面的那个XX“和”人“,意思就是说
今天你贪了,明天一座监狱就把你套起来,纵观古今,有多少豪杰与"贪“结下了不解之缘,呵呵,扯远了。
这个贪心的行为在算法中也成为了一种指导思想,也就是说贪心算法所作出的选择在当时的环境下是最好的,说深一点就是它只是某种
意义上的局部最优解,但不一定是全局最优解,此时往往接近于最优解。
一: 优点
前面也说了,贪心只是求的当前环境下的最优解,而不是追究整体的最优解,所以贪心就避免了为求的整体最优解而枚举各种方案所
耗费的时间。
二: 问题
① 不能保证贪心所得出的解是整体最优的。
② 不能用来求最大解和最小解问题。
③ 只能求满足某些约束条件的可行解的范围。
三: 案例
其实说到贪心,基本上都会提到“背包问题”,这里我就举一个“找零钱的问题“,对的,找零钱问题是我们生活中一个活生生的贪心算法
的例子,比如我买了“康师傅来一桶方便面”,给了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张。
闲话不说,上代码:
package com.bankht.suanfa.tanxin; import java.util.Scanner; import org.junit.Test; /** * @author zhuyong * @创建时间:2012-6-13 下午02:33:31 * * @类说明 :贪心算法测试程序 */ public class tanxin { public void getChange(float money) { int yuan100 = 0, yuan50 = 0, yuan20 = 0, yuan10 = 0, yuan5 = 0, yuan1 = 0, coin5 = 0, coin2 = 0, coin1 = 0; /** * 下面采用循环递减方式写demo */ while (money >= 100d) { yuan100++; money -= 100d; } while (money >= 50d) { yuan50++; money -= 50d; } while (money >= 20d) { yuan20++; money -= 20d; } while (money >= 10d) { yuan10++; money -= 10d; } while (money >= 5d) { yuan5++; money -= 5d; } while (money >= 1d) { yuan1++; money -= 1d; } while (money >= 0.5d) { coin5++; money -= 0.5d; } while (money >= 0.2d) { coin2++; money -= 0.2d; } while (money >= 0.1d) { coin1++; money -= 0.1d; } System.out.println("需找零:"); if (yuan100 > 0) { System.out.println("100元 " + yuan100 + "张"); } if (yuan50 > 0) { System.out.println("50元 " + yuan50 + "张"); } if (yuan20 > 0) { System.out.println("20元 " + yuan20 + "张"); } if (yuan10 > 0) { System.out.println("10元 " + yuan10 + "张"); } if (yuan5 > 0) { System.out.println("5元 " + yuan5 + "张"); } if (yuan1 > 0) { System.out.println("1元 " + yuan1 + "张"); } if (coin5 > 0) { System.out.println("5角 " + coin5 + "张"); } if (coin2 > 0) { System.out.println("2角 " + coin2 + "张"); } if (coin1 > 0) { System.out.println("1角 " + coin1 + "张"); } } @Test public void testTanxinSuanFa() { while (true) { System.out.println("请付款(精确到1角):"); Scanner scanner = new Scanner(System.in); float money = scanner.nextFloat(); getChange(money); } } }
运行结果:
请付款(精确到1角): 1688.8 需找零: 100元 16张 50元 1张 20元 1张 10元 1张 5元 1张 1元 3张 5角 1张 2角 1张 1角 1张
相关文章推荐
- 算法洗脑系列(8篇)——第三篇 贪心思想
- 算法洗脑系列(8篇)——第三篇 贪心思想
- 算法洗脑系列(8篇)——第三篇 贪心思想
- 算法洗脑系列(8篇)——第一篇 递推思想
- 算法洗脑系列(8篇)——第八篇 概率思想
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法洗脑系列(8篇)——第一篇 递推思想
- 算法洗脑系列(8篇)——第八篇 概率思想
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法洗脑系列(8篇)——第一篇 递推思想
- 算法洗脑系列(8篇)——第二篇 递归思想
- 算法洗脑系列(8篇)——第四篇 枚举思想
- 算法洗脑系列(8篇)——第四篇 枚举思想
- 算法洗脑系列(8篇)——第四篇 枚举思想
- 算法洗脑系列(8篇)——第五篇 分治思想
- 算法洗脑系列(8篇)——第五篇 分治思想
- 算法洗脑系列(8篇)——第五篇 分治思想
- 算法洗脑系列(8篇)——第六篇 回溯思想
- 算法洗脑系列(8篇)——第一篇 递推思想