动态规划入门之硬币问题

本文介绍了动态规划的基本思想,强调了找到问题的“状态”和“状态转移方程”的重要性,并通过硬币问题为例进行详细解析。动态规划在多项式时间内解决问题,优于回溯法和暴力法。在硬币问题中,定义状态d(i)表示求总和为i的最少硬币数量,通过状态转移方程d(i)=min{d(j)+1}(i-j在coins中)求解。文章还提供了JAVA代码实现,帮助理解解题过程。
摘要由CSDN通过智能技术生成

动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法、暴力法等要快许多。动态规划也是面试笔试题中的一个考查重点,当阅读一个题目并且开始尝试解决它时,首先看一下它的限制。 如果要求在多项式时间内解决,那么该问题就很可能要用DP来解。遇到这种情况, 最重要的就是找到问题的“状态”和“状态转移方程”。(状态不是随便定义的, 一般定义完状态,你要找到当前状态是如何从前面的状态得到的, 即找到状态转移方程)如果看起来是个DP问题,但你却无法定义出状态, 那么试着将问题规约到一个已知的DP问题。

这里先说明一个最简单的动态规划实例:硬币问题。后续还会给出更多的实例,例如:最长公共子序列,最长公共子串,最长递增子序列,字符串编辑距离等。动态规划的关键就是找出“状态”和“状态转移方程”。

硬币问题:给你一些面额的硬币,然后给你一个值N,要你求出构成N所需要的最少硬币的数量和方案。分析:这个问题可以尝试用贪心算法去解决,先从面额最大的硬币开始尝试,一直往下找,知道硬币总和为N。但是贪心算法不能保证能够找出解(例如,给,2,3,5,然后N=11)。我们可以换个思路,我们用d(i)表示求总和为i的最少硬币数量(其实就是动态规划中的“状态”),那么怎么从前面的状态(并不一定是d(i-1)这一个状态)到d(i)这个状态?假设硬币集合为coins[0~N],在求d(i)之前,我们假设d(1~i-1)全部都求出来了,那么d(i)=min{d(j)+1},if i-j 在coins中(其实这就是“状态转移方程”)。举例说明&#x

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值