Java动态规划之硬币找零问题实现示例

 更新时间:2022年08月04日 10:43:53   作者:程序员小徐同学  
本文主要介绍了Java动态规划之硬币找零问题实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法–动态规划。1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。

动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。举例:线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等;树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等;背包问题:01背包问题,完全背包问题,多重背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等;

文章主要介绍了Java动态规划之硬币找零问题实现代码,具有一定参考价值,需要的朋友可以了解下。

动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问题的解,就可以直接取出这些已经计算过的解而免去重复运算。保存子问题的解可以使用填表方式,例如保存在数组中。\

用一个实际例子来体现动态规划的算法思想——硬币找零问题。

问题描述:

假设有几种硬币,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。例如几种硬币为[1, 3, 5], 面值2的最少硬币数为2(1, 1), 面值4的最少硬币数为2(1, 3), 面值11的最少硬币数为3(5, 5, 1或者5, 3, 3).

问题分析:

假设不同的几组硬币为数组coin[0, ..., n-1]. 则求面值k的最少硬币数count(k), 那么count函数和硬币数组coin满足这样一个条件:

count(k) = min(count(k - coin[0]), ..., count(k - coin[n - 1])) + 1;
并且在符合条件k - coin[i] >= 0 && k - coin[i] < k的情况下, 前面的公式才成立.
因为k - coin[i] < k的缘故, 那么在求count(k)时, 必须满足count(i)(i <- [0, k-1])已知, 所以这里又涉及到回溯的问题.

所以我们可以创建一个矩阵matrix[k + 1][coin.length + 1], 使matrix[0][j]全部初始化为0值, 而在matrix[i][coin.length]保存面值为i的最少硬币数.

具体的过程如下:

* k|coin 1  3  5  min
 * 0    0  0  0  0
 * 1    1  0  0  1
 * 2    2  0  0  2
 * 3    3  1  0  3, 1
 * 4    2  2  0  2, 2
 * 5    3  3  1  3, 3, 1
 * 6    2  2  2  2, 2, 2
 * ...

最后, 具体的Java代码实现如下:

public static int backTrackingCoin(int[] coins, int k) {//回溯法+动态规划
    if (coins == null || coins.length == 0 || k < 1) {
      return 0;
    }
    int[][] matrix = new int[k + 1][coins.length + 1];
    for (int i = 1; i <= k; i++) {
      for (int j = 0; j < coins.length; j++) {
        int preK = i - coins[j];
        if (preK > -1) {//只有在不小于0时, preK才能存在于数组matrix中, 才能够进行回溯.
          matrix[i][j] = matrix[preK][coins.length] + 1;//面值i在进行回溯
          if (matrix[i][coins.length] == 0 || matrix[i][j] < matrix[i][coins.length]) {//如果当前的硬币数目是最少的, 更新min列的最少硬币数目
            matrix[i][coins.length] = matrix[i][j];
          }
        }
      }
    }
    return matrix[k][coins.length];
  }

代码经过测试, 题目给出的测试用例全部通

到此这篇关于Java动态规划之硬币找零问题实现示例的文章就介绍到这了,更多相关Java 硬币找零内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot2学习世界著名程序springboot开发体验

    springboot2学习世界著名程序springboot开发体验

    这篇文章主要为大家介绍了世界著名程序springboot开发体验,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Spring MVC实现GET请求接收Date类型参数

    Spring MVC实现GET请求接收Date类型参数

    这篇文章主要介绍了Spring MVC实现GET请求接收Date类型参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot不读取bootstrap.yml/properties文件问题

    SpringBoot不读取bootstrap.yml/properties文件问题

    这篇文章主要介绍了SpringBoot不读取bootstrap.yml/properties文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java实现快速排序算法(Quicktsort)

    Java实现快速排序算法(Quicktsort)

    这篇文章主要介绍了Java实现快速排序算法(Quicktsort),有需要的朋友可以参考一下
    2013-12-12
  • Java对象转换的方案分享

    Java对象转换的方案分享

    这篇文章主要介绍了Java对象转换的方案分享,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • Spring Boot启动banner定制的步骤详解

    Spring Boot启动banner定制的步骤详解

    这篇文章主要给大家介绍了关于Spring Boot启动banner定制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • SpringBoot超详细讲解事务管理

    SpringBoot超详细讲解事务管理

    事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就 回退到事务开始未进行操作的状态。事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,大部分情况下也都需要使用事务
    2022-08-08
  • json序列化时忽略值为null的字段2种方式实例

    json序列化时忽略值为null的字段2种方式实例

    这篇文章主要给大家介绍了关于json序列化时忽略值为null的字段的2种方式,当对象中某个字段为null时,我们希望将对象转换成json时为null的字段不会被转换到json字符串,里面需要的朋友可以参考下
    2023-10-10
  • java基于C/S结构实现多线程聊天室

    java基于C/S结构实现多线程聊天室

    这篇文章主要为大家详细介绍了java基于C/S结构实现多线程聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 一文详解Spring security框架的使用

    一文详解Spring security框架的使用

    Spring Security是一个基于Spring框架的安全认证和授权框架,它提供了一套全面的安全解决方案,可以在Web应用、移动应用和Web服务等不同场景下使用。本文就来详细聊聊它的使用吧
    2023-03-03

最新评论