@@ -70,7 +70,6 @@ class Solution:
70
70
cur = queue.popleft()
71
71
for coin in coins:
72
72
if cur == coin:
73
- step += 1
74
73
return step
75
74
elif cur > coin and cur - coin not in visited:
76
75
queue.append(cur - coin)
@@ -100,42 +99,39 @@ class Solution:
100
99
101
100
###### 3. 状态转移方程
102
101
103
- $dp[ c] = \begin{cases} dp [ c ] & c < coins [ i - 1 ] \cr min \lbrace dp[ c] , dp[ c - coins [ i - 1 ]] + 1 \rbrace & c \ge coins [ i - 1 ] \end{cases} $
102
+ $dp[ c] = min( dp[ c] , dp[ c - coin ] + 1) $
104
103
105
- 1 . 当 $c < coins[ i - 1] $ 时:
106
- 1 . 不使用第 $i - 1$ 枚硬币,只使用前 $i - 1$ 枚硬币凑成金额 $w$ 的最少硬币数量,即 $dp[ c] $。
107
- 2 . 当 $c \ge coins[ i - 1] $ 时,取下面两种情况中的较小值:
108
- 1 . 不使用第 $i - 1$ 枚硬币,只使用前 $i - 1$ 枚硬币凑成金额 $w$ 的最少硬币数量,即 $dp[ c] $。
109
- 2 . 凑成金额 $c - coins[ i - 1] $ 的最少硬币数量,再加上当前硬币的数量 1ドル,ドル即 $dp[ c - coins[ i - 1]] + 1$。
104
+ 对于每种硬币 $coin,ドル当 $c \ge coin$ 时,取下面两种情况中的较小值:
105
+ 1 . 不使用当前硬币,只使用之前硬币凑成金额 $c$ 的最少硬币数量,即 $dp[ c] $。
106
+ 2 . 凑成金额 $c - coin$ 的最少硬币数量,再加上当前硬币的数量 1ドル,ドル即 $dp[ c - coin] + 1$。
110
107
111
108
###### 4. 初始条件
112
109
113
110
- 凑成总金额为 0ドル$ 的最少硬币数量为 0ドル,ドル即 $dp[ 0] = 0$。
114
- - 默认情况下,在不使用硬币时,都不能恰好凑成总金额为 $w$ ,此时将状态值设置为一个极大值(比如 $n + 1 $),表示无法凑成。
111
+ - 默认情况下,在不使用硬币时,都不能恰好凑成总金额为 $c$ ,此时将状态值设置为一个极大值(比如 $+\infty $),表示无法凑成。
115
112
116
113
###### 5. 最终结果
117
114
118
115
根据我们之前定义的状态,$dp[ c] $ 表示为:凑成总金额为 $c$ 的最少硬币数量。则最终结果为 $dp[ amount] $。
119
116
120
- 1 . 如果 $dp[ amount] \ne amount + 1 ,ドル则说明: $dp[ amount] $ 为凑成金额 $amount$ 的最少硬币数量,则返回 $dp[ amount] $。
121
- 2 . 如果 $dp[ amount] = amount + 1 ,ドル则说明:无法凑成金额 $amount,ドル则返回 $-1$。
117
+ 1 . 如果 $dp[ amount] \ne +\infty ,ドル则说明: $dp[ amount] $ 为凑成金额 $amount$ 的最少硬币数量,则返回 $dp[ amount] $。
118
+ 2 . 如果 $dp[ amount] = +\infty ,ドル则说明:无法凑成金额 $amount,ドル则返回 $-1$。
122
119
123
120
### 思路 2:代码
124
121
125
122
``` python
126
123
class Solution :
127
124
def coinChange (self , coins : List[int ], amount : int ) -> int :
128
- size = len (coins)
129
- dp = [(amount + 1 ) for _ in range (amount + 1 )]
125
+ dp = [float (' inf' )] * (amount + 1 )
130
126
dp[0 ] = 0
131
127
132
- # 枚举前 i 种物品
133
- for i in range ( 1 , size + 1 ) :
128
+ # 枚举每种硬币
129
+ for coin in coins :
134
130
# 正序枚举背包装载重量
135
- for c in range (coins[i - 1 ] , amount + 1 ):
136
- dp[c] = min (dp[c], dp[c - coins[i - 1 ] ] + 1 )
131
+ for c in range (coin , amount + 1 ):
132
+ dp[c] = min (dp[c], dp[c - coin ] + 1 )
137
133
138
- if dp[amount] != amount + 1 :
134
+ if dp[amount] != float ( ' inf ' ) :
139
135
return dp[amount]
140
136
return - 1
141
137
```
0 commit comments