Skip to content

Commit b41ad5d

Browse files
Update 322. 零钱兑换.md
1 parent bf00513 commit b41ad5d

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

Dynamic Programming/322. 零钱兑换.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242

4343
动态规划:
4444

45+
每种硬币的数量是无限的,因此是**完全背包问题**
46+
4547
`dp[i]` 指凑成总金额为 `i` 的最少硬币数量。状态转移方程为 $dp[i] = \min_{j = 0, .., n - 1}dp[i - coins[j]] + 1$。简而言之,取所有当前金额与 `coins` 数组之差最少硬币数量的最小值并加一。
4648

4749
假设 `coins = [1, 2, 5], amount = 11`,当 `i = 11` 时,取 ` coins` 数组中所有比 `11` 小的值,即 `dp[11 - 1], dp[11 - 2], dp[11 - 5]` 的最小值,最后加一即可。
@@ -67,4 +69,34 @@ class Solution {
6769
return dp[amount];
6870
}
6971
}
70-
```
72+
```
73+
74+
75+
76+
二维数组: `dp[i][j]` 表示前 `i` 个数组可以凑成总金额为 `j` 的最少硬币数量,并且初始化数组为最大值。
77+
78+
```Go
79+
func coinChange(coins []int, amount int) int {
80+
n := len(coins)
81+
dp := make([][]int, n + 1)
82+
for i := 0; i <= n; i++ {
83+
dp[i] = make([]int, amount + 1)
84+
for j := 1; j <= amount; j++ {
85+
dp[i][j] = 1 << 30
86+
}
87+
}
88+
for i := 1; i <= n; i++ {
89+
for j := 1; j <= amount; j++ {
90+
dp[i][j] = dp[i - 1][j]
91+
if j-coins[i-1] >= 0 {
92+
dp[i][j] = min(min(dp[i][j], dp[i-1][j-coins[i - 1]]+1), dp[i][j-coins[i - 1]]+1)
93+
}
94+
}
95+
}
96+
if dp[n][amount] == 1<<30 {
97+
return -1
98+
}
99+
return dp[n][amount]
100+
}
101+
```
102+

0 commit comments

Comments
 (0)