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} ...
随机推荐
- golang 字符串操作实例
package main import s "strings" import "fmt" var p = fmt.Println func main() { p ...
- java.util.concurrent包详细分析--转
原文地址:http://blog.csdn.net/windsunmoon/article/details/36903901 概述 Java.util.concurrent 包含许多线程安全.测试良好 ...
- 1Z0-053 争议题目解析607
1Z0-053 争议题目解析607 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 607.Examine the following scenario: -Database is ...
- 微信扫码支付+Asp.Net MVC
这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下.(demo在最下方) 一.准备工作 使用的微信API中的统一下单方法,关键的参数是‘公众账号I ...
- Windows Phone 8 开发系列(持续更新中)
1. 从应用列表再次点击应用,如何恢复到上次浏览的页面呢? 2. Windows Phone 文本框的 UpdateSourceTrigger 属性不支持 PropertyChanged 怎么办? 3 ...
- byte为什么要与上0xff?
无意间翻看之间的代码,发现了一段难以理解的代码. byte[] bs = digest.digest(origin.getBytes(Charset.forName(charsetName))) ; ...
- Ionic Lab下载地址
网站被墙,留下下载链接备用 Linux版本 Mac版本 Windows版本
- 异构(兼容dubbo)SOA系统架构(.net)优化升级
前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来. 但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离. 在推 ...
- 背水一战 Windows 10 (15) - 动画: 缓动动画
[源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...
- mssql 跨库获取mysql
exec sp_addlinkedserver @server='MYSQL', --这是链接服务器的名称 @srvproduct='mysql', --这个你自己随便吧 @provider='MSD ...