`

Java 贪心思想

阅读更多
说到“贪”字,很邪恶的一个词,记得和珅和大人拆解过这个字,为”今“和”贝“,而”贝“字分解成”上面的那个XX“和”人“,意思就是说
今天你贪了,明天一座监狱就把你套起来,纵观古今,有多少豪杰与"贪“结下了不解之缘,呵呵,扯远了。

   这个贪心的行为在算法中也成为了一种指导思想,也就是说贪心算法所作出的选择在当时的环境下是最好的,说深一点就是它只是某种
意义上的局部最优解,但不一定是全局最优解,此时往往接近于最优解。

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

二: 问题
     ① 不能保证贪心所得出的解是整体最优的。
     ② 不能用来求最大解和最小解问题。
     ③ 只能求满足某些约束条件的可行解的范围。

三: 案例
      其实说到贪心,基本上都会提到“背包问题”,这里我就举一个“找零钱的问题“,对的,找零钱问题是我们生活中一个活生生的贪心算法
的例子,比如我买了“康师傅来一桶方便面”,给了10两银子,方便面3.8两,那么收银mm该找我6.2两,现实中mm不自觉的就会用到贪心的行
为给我找最少张币,总不能我给mm一张,mm给我十几张,那样mm会心疼的。
此时mm提供的方案就是:5元1张,1元1张,2角1张。

闲话不说,上代码:
package com.jiaozg.algorithm.feibonaqie;

import java.util.Scanner;

import org.junit.Test;

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张 

但是我发现了一个问题,如果输入78.6的话,输出是不对的
78.6
需找零:
50元     1张
20元     1张
5元      1张
1元      3张
5角      1张
请付款(精确到1角):

少了一角,debug发现和一角比较的时候,那个数编程0.099999999999,所以一角就没有输出
这个问题的详细说一下
小数精确计算

System.out.println(2.00 -1.10);//0.8999999999999999
上面的计算出的结果不是 0.9,而是一连串的小数。问题在于1.1这个数字不能被精确表示为一个double,因此它被表示为最接近它的double值,该程序从2中减去的就是这个值,但这个计算的结果并不是最接近0.9的double值。
一般地说,问题在于并不是所有的小数都可以用二进制浮点数精确表示。
二进制浮点对于货币计算是非常不适合的,因为它不可能将1.0表示成10的其他任何负次幂。

解决问题的第一种方式是使用货币的最小单位(分)来表示:System.out.println(200-110);//90

第二种方式是使用BigDecimal,但一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double)来构造(也不能将float或double型转换成String再来使用BigDecimal(String)来构造,因为在将float或double转换成String时精度已丢失)。例如new BigDecimal(0.1),它将返回一个BigDecimal,也即0.1000000000000000055511151231257827021181583404541015625,正确使用BigDecimal,程序就可以打印出我们所期望的结果0.9:
System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.10")));// 0.9

另外,如果要比较两个浮点数的大小,要使用BigDecimal的compareTo方法。

参考:http://blog.csdn.net/m13666368773/article/details/7531473
分享到:
评论

相关推荐

    java贪心算法实验报告

    ### Java贪心算法实验报告知识点解析 #### 实验目的与环境 本次实验旨在通过实际操作进一步理解并掌握**贪心算法**的基本原理及其在解决特定问题中的应用方式。实验不仅要求参与者了解贪心算法的核心思想,还需通过...

    用贪心算法实现背包问题

    首先,我们要理解贪心算法的基本思想。贪心算法在每一步都做出看起来最好的选择,而不是提前考虑所有可能的组合。在背包问题中,这通常意味着每次选取价值与重量比最大的物品,直到背包无法再装下任何物品为止。 在...

    java贪心算法的解题思路+代码

    贪心算法的核心思想和特点。 如何识别和设计贪心策略以解决特定问题。 使用Java编程语言实现贪心算法的具体代码示例。 对不同问题的优化思路和代码实现过程的详细解析。 适用人群 这篇文章适合以下几类人群: 编程...

    贪心算法和动态规划(Java实现) 贪心算法和动态规划.pdf

    "贪心算法和动态规划(Java实现)" 贪心算法是一种常用的算法设计策略,它所做出的选择总是当前看来是最好的。贪心算法的设计关键是选择贪心策略,且必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只...

    贪心算法法-单源最短路径 java

    #### 二、贪心算法的基本思想 贪心算法是一种在每个步骤中都采取当前看来最好的选择,以期望全局最优解的算法策略。对于单源最短路径问题而言,贪心算法的关键在于每次选择当前未被访问过的距离源点最近的顶点加入...

    探究-贪心算法解决背包问题(Java实现)

    首先,我们需要理解贪心策略的基本思想:在每一步选择中,都采取当前看起来最好的选择,即每次都挑选单位重量价值最高的物品放入背包。但是,这种策略并不一定能得到全局最优解,因为贪心选择性质并不总是能保证背包...

    哈夫曼编码算法与分析(java实现)

    哈夫曼编码的主要思想是通过构造一棵二叉树,利用贪心算法来生成最优前缀码。 哈夫曼编码的优点是它可以根据字符的频率来分配编码长度,高频率字符的编码长度较短,低频率字符的编码长度较长,从而减少了数据的存储...

    贪心法部分背包问题

    通过这个实践案例,你可以不仅学习到贪心算法的基本思想,还能体会到算法在实际问题中的应用,并锻炼编程和调试技能。贪心法虽然简单直观,但在很多实际场景中都能找到应用,如任务调度、资源分配等问题。因此,理解...

    java-贪心算法-物流派件用车最少

    首先,我们要理解贪心算法的基本思想。贪心算法是一种局部最优解策略,它在每一步选择中都采取当前状态下最好或最优的选择,以期望得到全局最优解。在物流派件问题中,这可能意味着每次选择能装下最多包裹的车辆,...

    贪心法解决01背包(贪心算法)

    运用贪心策略解决0 1背包问题 void beibao(int *w,int *v,int *x,int n,int *C) { int i,j,temp; for(i=0;i;i++) for(j=i+1;j;j++) if(v[i]/w[i][j]/w[j]) { temp=v[i]; v[i]=v[j]; v[j]=temp...

    算法思想Java版

    - **贪心思想**:通过局部最优选择达到全局最优。 - **双指针**:用于处理数组或链表问题,提高效率。 - **排序**:基础算法之一,常见的有快速排序、堆排序等。 - **快速选择**:基于快速排序思想,用于寻找数组中...

    贪心算法java实现.docx

    贪心算法是一种简单的算法设计策略,其核心思想是在每一步都选择局部最优解,希望通过一系列的局部最优选择来达到全局最优解的目的。然而,并非所有的优化问题都能通过贪心策略找到全局最优解,贪心算法的有效性取决...

    用贪心算法处理删数问题

    在实际学习中,理解贪心算法的基本思想,掌握如何构建问题的贪心策略,以及学会分析其是否能导出全局最优解,都是至关重要的技能。通过分析提供的源码,我们可以学习到如何将理论知识转化为实际代码,这对于提升编程...

    贪心法实验--活动选择问题

    通过这个实验,我们可以深入理解贪心算法的思想,以及如何用C++实现这种算法来解决实际问题。同时,这也为我们提供了实践和提高编程技巧的机会,包括数据结构、排序算法和问题建模等。在实际应用中,贪心法常用于...

    贪心算法+递推+各种查找、排序算法

    其核心思想是从源节点开始,逐步扩展到图中的其他节点,每次选择距离最近的未访问节点加入到已知最短路径的集合中。这种方法保证了每一步都是局部最优的,最终能够得到全局最优的最短路径。 ### 递推算法 递推算法...

    贪心算法硬币问题_硬币问题_贪心算法硬币_

    贪心算法是计算机科学中解决问题的一种...尽管在某些特定情况下可能不完美,但它仍然是理解和掌握算法思想的重要案例。通过编写代码并不断优化,我们可以更好地掌握这种策略,并将其应用到更广泛的计算机科学问题中。

    贪心算法 找零钱问题

    贪心算法的基本思想是:在每个阶段都选择局部最优解,最终达到全局最优解。对于找零钱问题,贪心策略就是每次尽可能选择面额最大的硬币进行找零。 #### 四、贪心算法的具体实现 在给定的代码片段中,虽然代码本身并...

    贪心算法实验报告

    通过对贪心算法在哈夫曼编码、单源最短路径以及最小生成树这三个问题上的应用,我们不仅学习到了贪心算法的设计思想和实现方法,而且还通过具体的编程实践加深了对贪心算法的理解。这种通过实践学习的方式对于提高...

    哈夫曼编码的贪心算法设计

    3. **掌握贪心算法**:熟悉并熟练运用贪心算法的设计思想,学会分析问题,并采用合适的方法解决问题。 #### 实验内容概述 假设有一个字符集`{d1, d2, …, dn}`,其中每个字符出现的频率分别为`{w1, w2, …, wn}`。...

Global site tag (gtag.js) - Google Analytics