爬楼梯背包解法:每一次爬的阶数是物品,楼层数是背包容量,排列问题故外层遍历背包容量,内层遍历物品
class Solution:
def climbStairs(self, n: int) -> int:
dp = [0]*(n + 1)
dp[0] = 1
m = 2
# 遍历背包
for j in range(n + 1):
# 遍历物品
for step in range(1, m + 1):
if j >= step:
dp[j] += dp[j - step]
return dp[n]
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
思路:完全背包,动态数组dp[i]定义 凑成总金额为 i 时所需的最少硬币个数,转移公式为:dp[i] =min(dp[i], dp[i - coins]), 初始dp[0]为0
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(amount+1):
for coin in coins:
if i < coin:
continue
dp[i] = min(dp[i], dp[i-coin] + 1)
return dp[-1] if dp[-1] < float("inf") else -1
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
思路:完全背包,数字是物品,数字的平方是体积。n是容量
class Solution:
def numSquares(self, n: int) -> int:
dp = [float("inf") for _ in range(n+1)]
dp[0] = 0
for i in range(n+1):
for num in range(1, i+1):
if num * num > i:
break
dp[i] = min(dp[i], dp[i - num*num] + 1)
return dp[-1]