Dynamic Programming - 322. Coin Change
322. Coin Change
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1
.
Example 1:
Input: coins = [1, 2, 5], amount = 11 Output: 3 Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3 Output: -1
Note: You may assume that you have an infinite number of each kind of coin.
思路:
这是一道经典的动态规划最值问题,和279题很像,题目意思是换零钱,比如求的总额为A,那么最后一步就是求出置换A需要最少的硬币,如果存在一个数B,满足
B + coins[i] = A,(0<= i <= len(coins)-1)
,那么A的最少置换硬币数就变成B的最少置换硬币数+1,子问题就变成求B,所以状态转移方程就变成dp[i] = min{dp[i - coins[j]] + 1}, for all j
,初始条件就是dp[0],因为没有dp[0]是不能通过状态转移方程求出来。而初始值,可以设置为一个最大值,这样就能取最小值。
代码:
go:
func coinChange(coins []int, amount int) int {
dp := make([]int, amount+1)
n := len(coins)
// initialization
dp[0] = 0;
for i := 1; i <= amount; i++ {
dp[i] = math.MaxInt32
for j := 0; j < n; j++ {
if i >= coins[j] && dp[i - coins[j]] != math.MaxInt32{
dp[i] = min(dp[i - coins[j]] + 1, dp[i])
}
}
}
if dp[amount] == math.MaxInt32 {
dp[amount] = -1
}
return dp[amount]
}
func min(i, j int) int {
if i < j {
return i
}
return j
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python标准库之glob介绍
- Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
- 使用List中的remove方法遇到的坑,不信你没有踩过!
- python opencv 图像尺寸变换
- OpenCv保存图像
- 机器学习|KNN
- docker 查看容器日志
- consul配置ACL
- CentOS7.5更改python版本后及yum不能用的解决办法,非编译!
- nginx 配置websocket
- PostgreSQL10分区表性能研究报告
- linux文件目录管理基本命令总结
- Linux中的硬链接与软链接?
- linux中实现灵活的特殊权限管理ACL,以及ACL权限判断顺序!
- 高并发下如何保证接口的幂等性?