贪心思想

来源:互联网 发布:淘宝大学江西商学院 编辑:程序博客网 时间:2024/05/16 08:52

 本文借鉴:http://blog.csdn.net/m13666368773/article/details/7531473

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

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

 

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

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

 

一: 优点

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

耗费的时间。

 

二: 问题

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

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

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

 

三: 案例

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

的例子,比如我买了“康师傅来一桶方便面”,给了10两银子,方便面3.8两,那么收银mm该找我6.2两,现实中mm不自觉的就会用到贪心的行

为给我找最少张币,总不能我给mm一张,mm给我十几张,那样mm会心疼的。

此时mm提供的方案就是:5元1张,1元1张,2角1张。

 

闲话不说,上代码:

[java] view plaincopyprint?
  1. package com.bankht.suanfa.tanxin;  
  2.   
  3. import java.util.Scanner;  
  4.   
  5. import org.junit.Test;  
  6.   
  7. /** 
  8.  * @author zhuyong 
  9.  * @创建时间:2012-6-13 下午02:33:31 
  10.  *  
  11.  * @类说明 :贪心算法测试程序 
  12.  */  
  13. public class tanxin {  
  14.   
  15.     public void getChange(float money) {  
  16.   
  17.         int yuan100 = 0, yuan50 = 0, yuan20 = 0, yuan10 = 0, yuan5 = 0, yuan1 = 0, coin5 = 0, coin2 = 0, coin1 = 0;  
  18.   
  19.         /** 
  20.          * 下面采用循环递减方式写demo 
  21.          */  
  22.         while (money >= 100d) {  
  23.             yuan100++;  
  24.             money -= 100d;  
  25.         }  
  26.         while (money >= 50d) {  
  27.             yuan50++;  
  28.             money -= 50d;  
  29.         }  
  30.         while (money >= 20d) {  
  31.             yuan20++;  
  32.             money -= 20d;  
  33.         }  
  34.         while (money >= 10d) {  
  35.             yuan10++;  
  36.             money -= 10d;  
  37.         }  
  38.         while (money >= 5d) {  
  39.             yuan5++;  
  40.             money -= 5d;  
  41.         }  
  42.         while (money >= 1d) {  
  43.             yuan1++;  
  44.             money -= 1d;  
  45.         }  
  46.         while (money >= 0.5d) {  
  47.             coin5++;  
  48.             money -= 0.5d;  
  49.         }  
  50.         while (money >= 0.2d) {  
  51.             coin2++;  
  52.             money -= 0.2d;  
  53.         }  
  54.         while (money >= 0.1d) {  
  55.             coin1++;  
  56.             money -= 0.1d;  
  57.         }  
  58.         System.out.println("需找零:");  
  59.         if (yuan100 > 0) {  
  60.             System.out.println("100元    " + yuan100 + "张");  
  61.         }  
  62.         if (yuan50 > 0) {  
  63.             System.out.println("50元     " + yuan50 + "张");  
  64.         }  
  65.         if (yuan20 > 0) {  
  66.             System.out.println("20元     " + yuan20 + "张");  
  67.         }  
  68.         if (yuan10 > 0) {  
  69.             System.out.println("10元     " + yuan10 + "张");  
  70.         }  
  71.         if (yuan5 > 0) {  
  72.             System.out.println("5元      " + yuan5 + "张");  
  73.         }  
  74.         if (yuan1 > 0) {  
  75.             System.out.println("1元      " + yuan1 + "张");  
  76.         }  
  77.         if (coin5 > 0) {  
  78.             System.out.println("5角      " + coin5 + "张");  
  79.         }  
  80.         if (coin2 > 0) {  
  81.             System.out.println("2角      " + coin2 + "张");  
  82.         }  
  83.         if (coin1 > 0) {  
  84.             System.out.println("1角      " + coin1 + "张");  
  85.         }  
  86.     }  
  87.   
  88.     @Test  
  89.     public void testTanxinSuanFa() {  
  90.         while (true) {  
  91.             System.out.println("请付款(精确到1角):");  
  92.             Scanner scanner = new Scanner(System.in);  
  93.             float money = scanner.nextFloat();  
  94.             getChange(money);  
  95.         }  
  96.     }  
  97.   
  98. }  



 

运行结果:

[javascript] view plaincopyprint?
  1. 请付款(精确到1角):  
  2. 1688.8  
  3. 需找零:  
  4. 100元    16张   
  5. 50元     1张    
  6. 20元     1张    
  7. 10元     1张    
  8. 5元      1张    
  9. 1元      3张    
  10. 5角      1张    
  11. 2角      1张    
  12. 1角      1张    
0 0