主要内容
完全背包的应用
动态规划题目
70. 爬楼梯 (进阶)
思路分析
背包容量为n,物品重量为[1,2],完全背包装满有几种方法
代码
class Solution:
def climbStairs(self, n: int) -> int:
# 用完全背包来做
dp = [0] * (n + 1)
dp[0] = 1
for j in range(1, n + 1):# 遍历背包
for i in [1,2]:# 遍历物品
if j >= i:
dp[j] += dp[j - i]
print(dp)
return dp[n]
322. 零钱兑换
思路分析
dp[i]表示凑成i需要的最少个数
递推公式 dp[i] = min(dp[i], dp[i - nums[j]] + 1)
初始化 dp[0] = 0
内外层循环顺序可交换
代码
class Solution:
# dp[i]表示凑成i需要的最少个数
# 递推公式 dp[i] = min(dp[i], dp[i - nums[j]] + 1)
# 初始化 dp[0] = 0
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [float('inf')] * (amount + 1)
dp[0] = 0
for i in range(amount + 1):
for c in coins:
if i >= c:
dp[i] = min(dp[i], dp[i - c] + 1)
# print(dp)
return dp[amount] if dp[amount] != float('inf') else -1
279.完全平方数
思路分析
和零钱一样
代码
class Solution:
def numSquares(self, n: int) -> int:
nums = [i*i for i in range(1,100)]
dp = [float(inf)] * (n + 1)
dp[0] = 0
for j in range(1, n + 1):
for i in nums:
if j >= i:
dp[j] = min(dp[j], dp[j - i] + 1)
return dp[n] if dp[n] != float(inf) else -1