1.​​题目​​

2.思想

dp思想,一道简单的dp题了。 与爬楼梯,拼接字符串很相似,只不过我们需要自己生成备选数组。

  • 定义​​dp[i]​​ 表示数字i 至少可由几个完全数构成。
  • 递推公式:​​dp[i]=min(dp[i],dp[i-squares[j]]+1)​​ 表示的含义就是递推求最小个数

3.代码

import math
class Solution:
def numSquares(self, n: int) -> int:
squares = self.get_squares(n)
# print(squares)
dp = [99999] * (n+1) # dp[i]表示数字i的最小需要的完全平方数
dp[1] = 1
dp[0] = 0
for i in range(1,n+1):
for j in range(len(squares)):
if squares[j] <= i : # 递推公式
dp[i] = min(dp[i],dp[i-squares[j]] + 1)
else:
break
# print(dp)
return dp[-1]

# 得到n 以内的完全平方数,并返回
def get_squares(self,n):
a = int(math.sqrt(n))
squares = [i**2 for i in range(1,a+1)]
return squares