[程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)
题目描述
给定arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数。
解题思路
- dp[i][j]表示只用第0到i种货币,凑成j元的最小货币张数。
- 初始化第一行
- 初始化中,无法凑成的初始化为Integer.MAX_VALUE-1否则+1会爆精度变为负数。
转移方程:
dp[i][j]=min{dp[i-1]【j-k*arr[i]】+k} (k>=0)
- 整理得
dp[i][j]=min{dp[i-1][j],min{dp[i-1]【j-k*arr[i]】+k}} (k>=1)
- 变换得
dp[i][j]=min{dp[i-1][j],min{dp[i-1]【j-(y+1)*arr[i]】+(y+1)}} (y>=0)
- 整理得
dp[i][j]=min{dp[i-1][j],min{dp[i-1]【j-arr[i]-y*arr[i]】+y+1}} (y>=0)
- 变换得最终转移方程:
dp[i][j]=min{dp[i-1][j],dp[i]【j-arr[i]】+1} (j-arr[i]>=0)
dp[i][j]=dp[i-1][j] (j-arr[i]<0)
含义上,即:用arr[0]-arr[i]的面值凑j的需要的最少张数=min{不用arr[i]凑j的最少张数,至少用一张arr[i]凑j-arr[i]的最少张数+1张}
代码采用空间压缩,使用一维的dp数组。
待做
感觉是完全背包,与经典问题中各量的对应关系思考一下。
代码
public class Solution {
public int getCoinsCount(int arr[],int aim){
int[] dp=new int[aim+1];
//initial
for(int j=0;j<=aim;++j) {
dp[j]=Integer.MAX_VALUE-1;//
}
for(int k=0;arr[0]*k<=aim;++k) {
dp[arr[0]*k]=k;
}
for(int i=1;i<arr.length;++i) {
for(int j=arr[i];j<=aim;++j) {
dp[j]=Math.min(dp[j], dp[j-arr[i]]+1);
}
}
if(dp[aim]==Integer.MAX_VALUE-1) {
return -1;
}
else {
return dp[aim];
}
}
}
[程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)的更多相关文章
- [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的 ...
- [程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(DP)
题意 给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法. 题解 状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备.dp ...
- [程序员代码面试指南]递归和动态规划-排成一条线的纸牌博弈问题(DP)
题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获 ...
- [程序员代码面试指南]递归和动态规划-最小编辑代价(DP)
问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入.删除.替换的编辑代价ic,dc,rc.输出将原字符串编辑成目标字符串的最小代价. 解题思路 状态表示 dp[i][j]表示把s ...
- [程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)
问题描述 如题. 例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234". 解题思路 状 ...
- [程序员代码面试指南]递归和动态规划-机器人达到指定位置方法数(一维DP待做)(DP)
题目描述 一行N个位置1到N,机器人初始位置M,机器人可以往左/右走(只能在位置范围内),规定机器人必须走K步,最终到位置P.输入这四个参数,输出机器人可以走的方法数. 解题思路 DP 方法一:时间复 ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
- 程序员代码面试指南 IT名企算法与数据结构题目最优解
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...
- [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)
题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...
随机推荐
- Nginx CORS 跨域资源共享问题
## 背景 新项目上线,前后端分离,遇到了跨域资源共享的问题,导致请求根本无法发送到后端,前端和后端貌似只能有一个来处理跨域问题,我们这边要采用nginx来解决跨域问题. ## Nginx的CORS配 ...
- docker入门3-docker swarm
swarm介绍 想要将应用部署在一个集群并运行在多台机器上? 通过将多台机器链接到"Dockerized"集群以实现应用程序运行在多容器,多机器的技术被称为swarm. 一个swa ...
- linux驱动之模块化驱动Makefile
本文摘自http://blog.csdn.net/lufeiop02/article/details/6446343 Linux驱动一般以模块module的形式来加载,首先需要把驱动编译成模块的形式. ...
- DataNode(面试开发重点)
1 DataNode工作机制 DataNode工作机制,如图所示. 1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和 ...
- Python中pytesseract库的使用以及注意事项
当我们在使用pytesseract库的时候,使用 pip install pytesseract安装完成后,发现它并不能识别出图片内容,并且会抛出异常pytesseract.pytesseract.T ...
- [源码解析] Flink的Slot究竟是什么?(1)
[源码解析] Flink的Slot究竟是什么?(1) 目录 [源码解析] Flink的Slot究竟是什么?(1) 0x00 摘要 0x01 概述 & 问题 1.1 Fllink工作原理 1.2 ...
- muduo源码解析2-AtomicIntegerT类
AtomicIntegerT template<typename T> class atomicTntergerT:public noncopyable { }; 作用: 与std::ao ...
- /usr/bin/ld: cannot find -lcrypto
当我们使用openssl里边的函数的时候,需要链接crypto的库 如果找不到,加一个软链接,如下: ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libc ...
- 华为荣耀5X(畅玩版 全网通)USB调试模式如何开启教程(开发者模式 开发者选项打开)
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, 前一段时间,公司买了一款华为荣耀畅玩版5X全网通,进行测试.发现 拿usb数据线连接PC电脑,无法进 ...
- javaScript 推荐书籍 由简单到入门,初级到高级。