1.题目
2.题目意思
拿硬币,看看有多少种情况。
3.代码
class Solution:
def waysToChange(self, n: int) -> int:
l = [25,10,5,1]
dp = [0]*(n+1)
dp[0] = 1
for i in range(len(l)):
for j in range(l[i], n+1):
dp[j] += dp[j-l[i]]
return dp[-1]%1000000007
思路:dp~
很基础的dp题,二维状态转移方程很容易得出:
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − c o i n s [ i ] ] dp[i][j]=dp[i-1][j]+dp[i-1][j-coins[i]] dp[i][j]=dp[i−1][j]+dp[i−1][j−coins[i]]
其中,
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示前i
种硬币共拿j
分有多少种方案。初始化很显然
d
p
[
0
]
=
1
dp[0]=1
dp[0]=1,因为啥都拿不了,就这一种方案。然后转移方程啥意思呢?第一项
d
p
[
i
−
1
]
[
j
]
dp[i-1][j]
dp[i−1][j]表示前i-1
种硬币共拿j
分的方案数,那我第i
种硬币不拿就是了。第二项
d
p
[
i
−
1
]
[
j
−
c
o
i
n
s
[
i
]
]
dp[i-1][j-coins[i]]
dp[i−1][j−coins[i]]表示前i-1
种硬币共拿j-coins[i]
分的方案数,然后加上第i
种硬币拿coins[i]
,这样就正好是
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]。
最后代码上第二个for
循环逆序,可以直接将空间压缩成一维~
冲冲冲~