题目:

假设有 8元,3 元,1 元,5元的硬币若干(无限),现在需要凑出3 元,问有多少种情况可以凑出硬币

动态规划的解题四步骤

步骤参考了csdn上面的讲解,很细致,所以借用这个思路总结

动态规划的的四个解题步骤是:

  • 定义子问题

  • 写出子问题的递推关系

  • 确定 DP 数组的计算顺序

  • 空间优化(可选)

  • 可以参考LeetCode 例题精讲 | 14 打家劫舍问题:动态规划的解题四步骤_程序员吴师兄的博客-CSDN博客

第一步,定义子问题。

设硬币面值的集合为C{c2,c2,c3,...,cm},子问题是f(K)

那么f(k)子问题 可以定义为:

在选择集合C中的数据,可以凑出金额k的方案的个数是多少,来进行分析规划。

第二步,写出子问题的递推关系。

考虑第一个硬币放哪个,如果放1的话,剩下的方案k-1的方案个数就是f(k-1)也就是,凑出金额k-1的方案的个数是多少

我们就由此可以得到递推关系:

子问题的 base case:

表示:凑出金额0的方案数是1(什么情况下需要凑出金额0呢?也就是上一步已经完整的得到了我们凑出的数)

第三步,确定 DP 数组的计算顺序。

确定 DP 数组计算顺序的重点是看子问题的依赖关系。

我们可以判定,8>需要凑出的元素3,所以排除可能

DP 数组中的每个元素只依赖其左边的元素。在本题中,f(k)依赖于f(k-1),f(k-3)和f(k-5)三种情况

怎么理解呢:

比如我们定义现在的情况是f(k),那么他的前一步,就可能是f(k-1),f(k-3)和f(k-5)三种情况我们笼统的定义为f(k-i)

假设前一步是f(k-1)的话 在前一步,就会是f(k-1-1);f(k-1-3)和f(k-1-5)三种情况

DP数组图:

有点类似于递归的思想,那么什么时候跳出这种类递归呢?就是在f(0)的时候,凑出金额为0了跳出递归返回值了。

代码如下:

public int combinationSum4(int n, int[] coins) {// 创建dp数组,默认初始化为0,大小为需要规划的值+1int[] dpResult = new int[n + 1];// 定义 base case,也就是f(0)的情况=1dpResult[0] = 1;//遍历dp数组,从第二位到最后for (int k = 1; k <= n; k++) {//遍历coins数组for (int i=0; i<coins.length; i++) {//判定k>=n的情况,也就是k在右边,依赖于K左边的[k-i]的元素if (k >= i) {dpResult[k] += dpResult[k-i];}}}return dpResult[n];

动态规划问题(凑硬币)理解总结相关推荐

  1. 动态规划例子,凑硬币,支持各种硬币组合并打印组合详情

    凑硬币是动态规划的一个经典例子,比如有硬币1,3,5,则组合出11有几种方案,最少硬币个数的有几种方案. 网上例子一般都是硬币组合1,3,5,如果不是1开头的就挂了,比如硬币组合是2,5,8,自己编写 ...

  2. 凑硬币(58同城2017校招笔试题)

    凑硬币(58同城2017校招笔试题) 暴力破解,循环递归实现,代码如下: /** * 暴力破解,循环递归,找出了所有可能的组合并进行了存储,* 在循环递归的时候,因为选取的分类相互是有重叠的,生成的递 ...

  3. java最少钱币数_最少钱币数(凑硬币)详解-2-动态规划算法(初窥)-CCF-CSP练习题(100)...

    目录 这篇使用动态规划算法来解决这个问题,借这篇博客初窥动态规划算法.最少钱币数问题也可以看作多重背包问题. 那么什么是动态规划算法? 动态规划(dynamic programming,DP)是运筹学 ...

  4. python-动态规划题目-凑硬币

    题目 文章目录 题目 递归方法 动态规划 首先确定状态 最后一步 分解成子问题 其次确定转移方程 最后确定初始条件和边界情况 两种方法的区别 参考文章 你有三种硬币,面值分别为2元,5元,7元,每种硬 ...

  5. 枚举法 之Java实现凑硬币

    问题? 如何利用1元五元十元凑硬币 Scanner in=new Scanner(System.in);int amout ;amout=in.nextInt();for(int one =0;one ...

  6. Java实现凑硬币或者最少硬币数

    标题:Java实现凑硬币或者最少硬币数 参考视频:参考视频 建议可以看完视频后,再来写代码,或者看这个blog 示例: 作为dp问题求解: public int coinChange(int[] co ...

  7. C语言:凑硬币(两元硬币的组合方案)

    一元硬币的组合 算法思路: 1.一元硬币可以分成1.2.5角等组成 2.可以采用控制变量来进行枚举试验: 3.将可以构成指定元的组合方案进行输出. 代码如下: #include<stdio.h& ...

  8. 穷举法解八皇后问题和凑硬币问题

    八皇后问题 (英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意 ...

  9. java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现

    硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题.如果你需要查看上一篇,可以点击下面链接: 详解动态规划01背包 ...

最新文章

  1. asp.NET自定义服务器控件内部细节系列教程四
  2. 想象中的论文答辩和真实的论文答辩,哈哈哈哈哈哈……
  3. 详细!看看顶级互联网公司都在研究的无服务器架构!
  4. Winform开发框架中工作流模块的业务表单开发
  5. 代理模式 、JDK动态代理、cglib动态代理
  6. HDU4267(2012长春网络赛)
  7. 学术前沿 | Texar-PyTorch:在PyTorch里重现TensorFlow的最佳特性
  8. 干什么事都要先定位,再聚焦
  9. Gesture APIs-Furthering Windows Mobile 6.5 Touch Gesture Framework
  10. [转载]Dorado中DataTable使用技巧汇总
  11. nagios常见错误及页面错误
  12. 代写计算机ei,骗子 张爱荣 以代写代发EI期刊骗钱 钱收到后QQ不上,手机关机
  13. pandas数据合并与重塑(pd.concat篇)
  14. 要跳过磁盘检查,请在5秒内按任意键如何解决
  15. OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同步工作
  16. 【资源下载】敬勇 - 一条执行时间小于1秒的 SQL 引发的性能问题
  17. golang rabbitMQ 生产者复用channel以及生产者组分发策略
  18. 华为S/CE系列交换机stelnet示例(带外管理地址绑定vpn实现业务和管理平面的隔离)
  19. 翻译(5): 技术债务墻:一种让技术债务可见并可协商的方法
  20. 抢红包技术大揭秘:如何使用Redis轻松实现抢红包

热门文章

  1. 安装win7和Ubuntu双系统后,win7耳机没声音,外放有声音
  2. 大家一起学数据结构之单链表
  3. 【jquery】通过降低图片的质量(或尺寸)压缩图片大小
  4. 英雄会归来,做个人物小点评。
  5. 大数据起步之wormhole初识
  6. mysql笔记(一):Navicat for MySQL远程连接mysql服务报错的解决方法(1130、2509)
  7. springSecurity 中不能抛出异常UserNameNotFoundException 解析
  8. int 类型 转 long的坑
  9. Franka Emika Panda机械臂规划路径时,rviz中手爪显示碰撞
  10. Android开发使用LocationManager实现定位服务