518. 零钱兑换 II
题目描述:
给你一个整数数组 coins
表示不同面额的硬币,另给一个整数 amount
表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0
。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
解题思路:
算法思路:
先将问题「转化」成我们熟悉的题型。
i.
在⼀些物品中「挑选」⼀些出来,然后在满⾜某个「限定条件」下,解决⼀些问题,⼤概率
是背包模型;
ii.
由于每⼀个物品都是⽆限多个的,因此是⼀个「完全背包」问题。
接下来的分析就是基于「完全背包」的⽅式来的。
1.
状态表⽰:
dp[i][j]
表⽰:从前
i
个硬币中挑选,总和正好等于
j
,⼀共有多少种选法。
2.
状态转移⽅程:
线性
dp
状态转移⽅程分析⽅式,⼀般都是「根据最后⼀步」的状况,来分情况讨论。但是最后
⼀个物品能选很多个,因此我们的需要分很多情况:
i.
选
0
个第
i
个硬币:此时相当于就是去前
i - 1
个硬币中挑选,总和正好等于
j
。
此时最少的硬币个数为
dp[i - 1][j]
;
ii.
选
1
个第
i
个硬币:此时相当于就是去前
i - 1