动态规划问题(凑硬币)理解总结
题目:
假设有 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,3,5,则组合出11有几种方案,最少硬币个数的有几种方案. 网上例子一般都是硬币组合1,3,5,如果不是1开头的就挂了,比如硬币组合是2,5,8,自己编写 ...
- 凑硬币(58同城2017校招笔试题)
凑硬币(58同城2017校招笔试题) 暴力破解,循环递归实现,代码如下: /** * 暴力破解,循环递归,找出了所有可能的组合并进行了存储,* 在循环递归的时候,因为选取的分类相互是有重叠的,生成的递 ...
- java最少钱币数_最少钱币数(凑硬币)详解-2-动态规划算法(初窥)-CCF-CSP练习题(100)...
目录 这篇使用动态规划算法来解决这个问题,借这篇博客初窥动态规划算法.最少钱币数问题也可以看作多重背包问题. 那么什么是动态规划算法? 动态规划(dynamic programming,DP)是运筹学 ...
- python-动态规划题目-凑硬币
题目 文章目录 题目 递归方法 动态规划 首先确定状态 最后一步 分解成子问题 其次确定转移方程 最后确定初始条件和边界情况 两种方法的区别 参考文章 你有三种硬币,面值分别为2元,5元,7元,每种硬 ...
- 枚举法 之Java实现凑硬币
问题? 如何利用1元五元十元凑硬币 Scanner in=new Scanner(System.in);int amout ;amout=in.nextInt();for(int one =0;one ...
- Java实现凑硬币或者最少硬币数
标题:Java实现凑硬币或者最少硬币数 参考视频:参考视频 建议可以看完视频后,再来写代码,或者看这个blog 示例: 作为dp问题求解: public int coinChange(int[] co ...
- C语言:凑硬币(两元硬币的组合方案)
一元硬币的组合 算法思路: 1.一元硬币可以分成1.2.5角等组成 2.可以采用控制变量来进行枚举试验: 3.将可以构成指定元的组合方案进行输出. 代码如下: #include<stdio.h& ...
- 穷举法解八皇后问题和凑硬币问题
八皇后问题 (英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意 ...
- java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现
硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题.如果你需要查看上一篇,可以点击下面链接: 详解动态规划01背包 ...
最新文章
- asp.NET自定义服务器控件内部细节系列教程四
- 想象中的论文答辩和真实的论文答辩,哈哈哈哈哈哈……
- 详细!看看顶级互联网公司都在研究的无服务器架构!
- Winform开发框架中工作流模块的业务表单开发
- 代理模式 、JDK动态代理、cglib动态代理
- HDU4267(2012长春网络赛)
- 学术前沿 | Texar-PyTorch:在PyTorch里重现TensorFlow的最佳特性
- 干什么事都要先定位,再聚焦
- Gesture APIs-Furthering Windows Mobile 6.5 Touch Gesture Framework
- [转载]Dorado中DataTable使用技巧汇总
- nagios常见错误及页面错误
- 代写计算机ei,骗子 张爱荣 以代写代发EI期刊骗钱 钱收到后QQ不上,手机关机
- pandas数据合并与重塑(pd.concat篇)
- 要跳过磁盘检查,请在5秒内按任意键如何解决
- OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同步工作
- 【资源下载】敬勇 - 一条执行时间小于1秒的 SQL 引发的性能问题
- golang rabbitMQ 生产者复用channel以及生产者组分发策略
- 华为S/CE系列交换机stelnet示例(带外管理地址绑定vpn实现业务和管理平面的隔离)
- 翻译(5): 技术债务墻:一种让技术债务可见并可协商的方法
- 抢红包技术大揭秘:如何使用Redis轻松实现抢红包
热门文章
- 安装win7和Ubuntu双系统后,win7耳机没声音,外放有声音
- 大家一起学数据结构之单链表
- 【jquery】通过降低图片的质量(或尺寸)压缩图片大小
- 英雄会归来,做个人物小点评。
- 大数据起步之wormhole初识
- mysql笔记(一):Navicat for MySQL远程连接mysql服务报错的解决方法(1130、2509)
- springSecurity 中不能抛出异常UserNameNotFoundException 解析
- int 类型 转 long的坑
- Franka Emika Panda机械臂规划路径时,rviz中手爪显示碰撞
- Android开发使用LocationManager实现定位服务