DP优化与换零钱问题
1 当贪心不再起效的时候
对于换零钱问题,最简单也是性能最好的方法就是贪心算法。可是贪心算法一定要满足面值相邻两个零钱至少为二倍关系的前提条件。例如1,2,5,10,20……这样的零钱组应用贪心最简单;可对于1,3,4,5,6,10……这样的零钱组就不起效了:当目标总值是12的时候,应用贪心算法:答案是10x1+1x2,共3张,可正确答案应该是6x2共两张。
那怎么解决呢?这样的问题符合动态规划的特点:任何一个状态可以由前边的状态计算而得。
定义问题(明确需求):一组不重复且升序排列零钱面额数组vector<int> c(共m个元素),目标面值:int n,求所需最少的零钱张数。
2 O(mn)空间复杂度DP算法
就像背包问题。最经典的算法是生成一个(m+1)x(n+1)DP数组来保存中间值,其中dp[i][j]表示只利用第1~i种零钱凑成目标面值为j所需的最少零钱张数。
我们很容易得出状态转移方程:
dp[i][j]=min(0+dp[i-1][j],1+dp[i-1][j-1*c[i]],2+dp[i-1][j-2*c[i]], ······);
从而很容易写出代码。
但作为一个追(xian)求(de)卓(dan)越(teng)的程序员,我又怎么会满足于此?看起来时间复杂度O(mn)已经达到极至,可空间复杂度O(mn)好像可以继续优化!
3 O(n)空间复杂度DP算法
由上边的状态转移方程,我们发现每个元素只用到了上一行的若干个元素。那其实我们很容易想到,一个大小为2*(n+1)的一维数组就足够了!
状态转移方程:
dp[index][j]=min(0+dp[1-index][j],1+dp[1-index][j-1*c[i]],2+dp[1-index][j-2*c[i]], ······);
计算方法没有任何差别,但是空间复杂度却大大降低!
不仅如此,对于有一些DP算法,每个元素的计算只需要用到当前行左边的元素和上一行相同列坐标元素的值(例如矩阵的最小最径的DP算法),这样的算法,我们可以直接用一个n+1的一维数组作为DP数组就够用了!
4 总结
由此,我们可以总结出本文的中心思想:
(1)一个二维DP算法,如果每个元素的计算只需要用到上一行的若干个元素的值的时候,我们都可以用两个一维DP数组来优化空间复杂度。
(2)一个二维DP算法,如果每个元素的计算只需要用到当前行左边的元素和上一行相同列坐标元素的值的时候,我们都可以用一个一维DP数组来优化空间复杂度。
(3)要多尝试降低二维DP算法的空间复杂度。
鼓掌[逃]!
DP优化与换零钱问题的更多相关文章
- 小P的故事——神奇的换零钱&&人活着系列之平方数
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2777&cid=1219 这题不会,看了别人的代码 #include <iostre ...
- 子集和问题(应用--换零钱)POJ2229:Sumsets
我一直在纠结换零钱这一类型的题目,今天好好絮叨一下,可以说他是背包的应用,也可以说他是单纯的dp.暂且称他为dp吧. 先上一道模板题目. sdut2777: 小P的故事——神奇的换零钱 题目描述 已知 ...
- SDUT3145:Integer division 1(换零钱背包)
题目:传送门 题目描述 整数划分是一个非常经典的数学问题. 所谓整数划分,是指把一个正整数n写成为n=m1+m2+...+mi的形式,其中mi为正整数,并且1<=mi<=n,此时,{m1, ...
- 取数字(dp优化)
取数字(dp优化) 给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数.问有多少种方案.有多个询问,每次询问一个的m对应的答案. \(1\le n\le 200000,1\le ...
- 51nod 1101 换零钱 【完全背包变形/无限件可取】
1101 换零钱 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...
- 51 Nod 1101 换零钱(动态规划好题)
1101 换零钱 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...
- [总结]一些 DP 优化方法
目录 注意本文未完结 写在前面 矩阵快速幂优化 前缀和优化 two-pointer 优化 决策单调性对一类 1D/1D DP 的优化 \(w(i,j)\) 只含 \(i\) 和 \(j\) 的项--单 ...
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
- DP 优化小技巧
收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...
随机推荐
- EasyUI DataGrid formatter 格式化增加链接
function fLoadTable() { $('#tt').datagrid({ title: '', ...
- 开启SharePoint Server 2013 中的“微博”功能——新闻源
熟悉SharePoint的朋友在2013之前的版本可以使用社区协作下的记事板.应用程序下的通知,来进行消息的发布,而且更有这两者的完美结合体讨论板,可供使用着根据站点属性进行添加而对现在的快消息时代, ...
- objective-c 语法快速过(3)
oc 里的匿名对象 oc 这里,很少用到,因为并不适用于oc的内存管理,只是面试笔试也许出现,要求能看懂,不要在项目里这样写,因为写匿名对象,会造成内存泄露 #import <Foundatio ...
- C#枚举类型的常用操作总结
枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...
- jQuery方法position()与offset()区别
参考别人写得比较明白的,红色部分为重点吧: 使用jQuery获取元素位置时,我们会使用position()或offset()方法,两个方法都返回一个包含两个属性的对象-左边距和上边距,它们两个的不同点 ...
- spring boot 调试 - 热部署
maven gradle Maven: 命令行方式: mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport= ...
- Moon.Orm与其他Orm的技术对比
有时候在思考大家为什么喜欢EF,为什么又出现这么多的Orm,为什么Nhiberate被人许多人接收又被许多人拒绝 最后发现结论:萝卜白菜各有所爱.适合自己的就是最好的. EF 微软团队支持(可谓强大的 ...
- The SQL Server Service Broker for the current database is not enabled
把一个数据恢复至另一个服务器上,出现了一个异常: The SQL Server Service Broker for the current database is not enabled, and ...
- error when loading the sdk error parsing
Error Parsing: C:\android-sdk_r24.2-windows\android-sdk-windows\system-images\android-22\android-wea ...
- N皇后问题
题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...