Skip to content

Commit 0fe0a23

Browse files
Create 518. 零钱兑换 II.md
1 parent e608254 commit 0fe0a23

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#### 518. 零钱兑换 II
2+
3+
难度:中等
4+
5+
---
6+
7+
给你一个整数数组 `coins` 表示不同面额的硬币,另给一个整数 `amount` 表示总金额。
8+
9+
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 `0`
10+
11+
假设每一种面额的硬币有无限个。 
12+
13+
题目数据保证结果符合 32 位带符号整数。
14+
15+
**示例 1:**
16+
17+
```
18+
输入:amount = 5, coins = [1, 2, 5]
19+
输出:4
20+
解释:有四种方式可以凑成总金额:
21+
5=5
22+
5=2+2+1
23+
5=2+1+1+1
24+
5=1+1+1+1+1
25+
```
26+
27+
**示例 2:**
28+
29+
```
30+
输入:amount = 3, coins = [2]
31+
输出:0
32+
解释:只用面额 2 的硬币不能凑成总金额 3 。
33+
```
34+
35+
**示例 3:**
36+
37+
```
38+
输入:amount = 10, coins = [10]
39+
输出:1
40+
```
41+
42+
**提示:**
43+
44+
* `1 <= coins.length <= 300`
45+
* `1 <= coins[i] <= 5000`
46+
* `coins` 中的所有值 **互不相同**
47+
* `0 <= amount <= 5000`
48+
49+
---
50+
51+
动态规划:
52+
53+
1. 二维数组,`dp[i][j]` 表示前 `i` 个数组凑成金额为 `j` 的组合数量
54+
55+
```Go
56+
func change(amount int, coins []int) int {
57+
n := len(coins)
58+
dp := make([][]int, n + 1)
59+
for i := range dp {
60+
dp[i] = make([]int, amount + 1)
61+
}
62+
dp[0][0] = 1
63+
for i := 1; i <= n; i++ {
64+
for j := 0; j <= amount; j++ {
65+
dp[i][j] = dp[i - 1][j]
66+
if j >= coins[i - 1] {
67+
dp[i][j] += dp[i][j - coins[i - 1]]
68+
}
69+
}
70+
}
71+
return dp[n][amount]
72+
}
73+
```
74+
75+
76+
77+
2. 一维数组,`dp[i]` 表示凑成金额为 `i` 的组合数量
78+
79+
```go
80+
func change(amount int, coins []int) int {
81+
dp := make([]int, amount + 1)
82+
dp[0] = 1
83+
for _, coin := range coins {
84+
for j := coin; j <= amount; j++ {
85+
dp[j] += dp[j - coin]
86+
}
87+
}
88+
return dp[amount]
89+
}
90+
```
91+

0 commit comments

Comments
 (0)