给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。
示例 1:
- 输入:coins = [1, 2, 5], amount = 11
- 输出:3
- 解释:11 = 5 + 5 + 1
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp=[float('inf')]*(amount+1)//创建数组,初始值为0
dp[0]=0
for coin in coins://遍历coins
for i in range (coin ,amount+1)://遍历背包
dp[i]=min(dp[i-coin]+1,dp[i])//更新最小硬币数量
return dp[amount] if dp[amount] !=float('inf') else -1//如果最小数量为有限个则返回dp[-1],否则返回-1
注意:在思路主要是,把amount当做是背包容量,coins 当做是物品,且为无限个。类似于完全背包。遍历顺序上coin和amount可以颠倒,因为要求是求最小硬币数。递推公式上是dp[i]=min(dp[i],dp[i-coin]+1),可以更新dp[i]的值。在初始值上,dp[0]=0,dp[i]=float('inf'),除了下表0以外的dp都为无穷大,min求最小值,防止初始值覆盖所求的值
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
- 输入:n = 12
- 输出:3
- 解释:12 = 4 + 4 + 4
class Solution:
def numSquares(self, n: int) -> int:
dp=[float('inf')]*(n+1)//创建数组,初始值为最大
dp[0]=0
for i in range(1,n+1)://遍历背包
for j in range (1,int(i**0.5)+1)://遍历完全平方数
dp[i]=min(dp[i],dp[i-j*j]+1)//递推公式,拼凑成数n所需要的最少完全平方数
return dp[-1]