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