零钱兑换&&完全平方数

给定不同面额的硬币 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]

你可能感兴趣的:(动态规划)