只能爬1阶或2阶是简单的动规 爬1-m阶是完全背包
def stairs(n,m):
dp=[0]*(n+1)
dp[0]=1
for j in range(1,n+1):
for i in range(1,m+1):
dp[j]+=dp[j-i]
return dp[-1]
组合问题先物品后容量 排列问题先容量后物品 这里取min,所以都初始化为float(‘inf’)
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp=[float('inf')]*(amount+1)
dp[0]=0
for coin in coins:
for i in range(coin,amount+1):
dp[i]=min(dp[i-coin]+1,dp[i])
if dp[-1]==float('inf'):
return -1
return dp[-1]
和上一题的套路完全一样
class Solution:
def numSquares(self, n: int) -> int:
dp=[float('inf')]*(n+1)
dp[0]=0
for i in range(1,int(n**0.5)+1):
for j in range(i*i,n+1):
dp[j]=min(dp[j-i*i]+1,dp[j])
return dp[-1]