Leetcode - 70
这题要用背包方法去做的话,就要想清楚如何转换为背包问题,首先想,物品是什么?由题目知,我们只能一步或者2步往上爬,所以就有物品 = [1,2],1,2无限使用,所以是完全背包,求总方案,所以是累加。1,2和2,1这里是两种方案,所以是排列问题,需要背包作为外层循环。
def climbStairs(self, n: int) -> int:
res = [1,2]
dp = [0] * (n+1)
dp[0] = 1
for j in range(1,len(dp)):
for i in res:
if j >=i:
dp[j] += dp[j - i]
return dp[-1]
Leetcode - 322
这里硬币数无限,所以是完全背包。求最小方案,所以这里初始化的时候,初始化成最大的元素。方案中顺序无所谓,所以是组合问题,常规for循环。求方案数,所以value[i]就是1
def coinChange(self, coins: List[int], amount: int) -> int:
dp= [float("INF")] * (amount +1)
dp[0] = 0
for i in coins:
for j in range(i,amount+1):
dp[j] = min(dp[j],dp[j-i]+1)
if dp[-1] ==float("INF"):
return -1
else:
return dp[-1]
Leetcode - 279
这题和上一题几乎一样,重点就在于,物品的列表如何去构建,若从1~n间的所有数字一一进行判断,则会超时。一种方法是直接添加数的平方,当这个数的平方小于等于n时,就将这个数的平方加入列表。
其余的一样,最少,求Min, 组合问题,
def numSquares(self, n: int) -> int:
#一一判断会超时
# def isSquare(num):
# if num ==1:
# return True
# else:
# end = num//2
# for i in range(1,end+1):
# if i ** 2 == num:
# return True
# return False
nums = [i**2 for i in range(1,n+1) if i**2 <=n]
dp = [float("INF")] * (n+1)
dp[0] = 0
for i in nums:
for j in range(i,len(dp)):
dp[j] = min(dp[j],dp[j - i]+1)
return dp[-1]