爬楼梯背包解法:每一次爬的阶数是物品,楼层数是背包容量,排列问题故外层遍历背包容量,内层遍历物品
- 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]