兑换零钱,动态规划,不同的初始状态
i元可以不加当前一枚硬币凑成dp[i],也可以加当前一枚硬币凑成dp[i-coin]+1。
所以新状态需要综合dp[i]和dp[i-coin]+1。
如果表达式不相同,原因在于dp初始化方式不同。
class Solution:
def minMoney(self , arr: List[int], aim: int) -> int:
if not aim: return 0
dp = [0]*(aim+1) # aim+1维dp数组,dp[i]表示能凑成i元的最小硬币数,dp[0]=0
for coin in arr: # 用每种硬币更新状态
dp[coin] = 1 # 用coin能凑coin元,最小需要1个,初始条件
for i in range(coin+1, aim+1):
if dp[i] and dp[i-coin]: # 取和不取coin都能凑成i元,取最小
dp[i] = min(dp[i], dp[i-coin]+1)
elif dp[i-coin]: # 不取coin凑不出i元,只能取
dp[i] = dp[i-coin]+1 # 其他,取coin凑不出i元,维持原状
return dp[-1] if dp[-1] else -1
京公网安备 11010502036488号