day50 动态规划part7 代码随想录算法训练营 279. 完全平方数

题目:279. 完全平方数

我的感悟:

  • 看文字也行

理解难点:

  • 物品是什么?是i*i<n的集合

听课笔记:

  • for i in range(1,int(n**0.5)+1):    # 遍历物品(1,4,9,..)物品从1开始
  • 如何构建物品集合?
  • 以及如何把i*i转化为物品,是难点

代码示例:

class Solution:
    def numSquares(self, n: int) -> int:
        # 完全背包问题
        # 顺序没关系,组合把
        # 递推公式难想,dp[j] = min(dp[j],dp[j-i*i]+1)
        # 物品是什么? 有限值 i*i <n
        # 背包n
        # dp[j] 含义是到整数j,包含完全平方的最小数量
        dp = [float('inf')] * (n+1)
        dp[0] = 0
        for i in range(1,int(n**0.5)+1):    # 遍历物品
            for j in range(n+1):    # 这里前边界写不对也没关系  # 写成这样是最对的 range(i * i, n + 1)
                if j-i*i >=0:   # 补充
                    dp[j] = min(dp[j],dp[j-i*i]+1)
        # print(dp)
        return dp[n]

通过截图:

边界写对的写法:

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')] * (n + 1)
        dp[0] = 0

        for i in range(1, int(n ** 0.5) + 1):  # 遍历物品
            for j in range(i * i, n + 1):  # 遍历背包
                # 更新凑成数字 j 所需的最少完全平方数数量 # 减少了判断
                dp[j] = min(dp[j - i * i] + 1, dp[j])

        return dp[n]

资料:

279.完全平方数  

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做 

视频讲解:https://www.bilibili.com/video/BV12P411T7Br

https://programmercarl.com/0279.%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0.html

posted @ 2024-02-29 12:40  o蹲蹲o  阅读(1)  评论(0编辑  收藏  举报