今天的题都是完全背包题
70. Climbing Stairs
重新考虑这道题.那么dp[i]代表的就是爬到i为止有多少种方法.递推公式就是dp[i]+=dp[i-j].因为只能爬一步或者两步,所以j只能取1或者2.
初始值至少有一种方法,所以dp[0]=1
这是在找排列,并没有顺序,所以先背包后物品
class Solution:
def climbStairs(self, n: int) -> int:
if n==1:
return 1
dp=[0 for _ in range(n+1)]
dp[0]=1
for i in range(1,n+1):
for j in range(1,3):
if i>=j:
dp[i]+=dp[i-j]
return dp[-1]
322. Coin Change
这道题dp[i]代表的是到i为止最少需要多少枚钱币. 递推公式就是dp[i]=min(dp[i],dp[i-j]+1).
初始值0时不用钱币,所以dp[0]=0. dp整体初值要inf因为再找最小的方法
这是在找排列,并没有顺序,所以先背包后物品
如果最终dp[-1]是inf说明没有找到所以要输出-1,反之输出值即可
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp=[float('inf') for _ in range(amount+1)]
dp[0]=0
for i in range(1,amount+1):
for coin in coins:
if i>=coin:
dp[i]=min(dp[i],dp[i-coin]+1)
if dp[-1]==float('inf'):
return -1
return dp[-1]
279. Perfect Squares
这道题还是完全背包问题. 这道题dp[i]代表的是到i为止需要多少个num组成.dp[i]=min(dp[i],dp[i-j*j]+1).
初始值0时没有可用的数,所以dp[0]=0. dp整体初值要inf因为再找最小的方法
这是在找排列,并没有顺序,所以先背包后物品,物品的平方要小于i
class Solution:
def numSquares(self, n: int) -> int:
dp=[float('inf') for _ in range(n+1)]
dp[0]=0
for i in range(1,n+1):
for j in range(1,int(sqrt(i)+1)):
dp[i]=min(dp[i],dp[i-j*j]+1)
return dp[-1]