这道题目是要用若干个完全平方数组成一个整数 n,目的是要组成和的完全平方数的个数最少,题目如下:
这道题目看似无从下手,因为没有办法通过暴力去求解,因为把一个数分解成数的和的形式,我们不知道可以分解成多少个数。所以我们可以考虑使用动态规划明首先我们定义一个长度为 n+1 的列表,然后我们可以定义一个动态规划的递推方程:
d
p
[
j
]
=
m
i
n
(
d
p
[
j
]
,
d
p
[
j
−
i
∗
∗
2
]
+
1
)
dp[j] = min(dp[j], dp[j - i**2] + 1)
dp[j]=min(dp[j],dp[j−i∗∗2]+1)
这个完全平方数就用
i
∗
∗
2
i**2
i∗∗2 来表示。当然这个完全平方数一定是小于或者等于 n 的,那么 i 的取值是小于
m
a
t
h
.
s
q
r
t
(
n
)
math.sqrt(n)
math.sqrt(n) 的,所以我们代码可以写成:
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
# 最大的平方数的平方根
maxn = int(math.sqrt(n))
# 定义一个 dp 列表
dp = [_ for _ in range(n + 1)]
for i in range(1, maxn + 1):
for j in range(i**2, n + 1):
# 动态 dp 方程
dp[j] = min(dp[j], dp[j - i**2] + 1)
return dp[n]
这道题目是很经典的一道动态规划思想的题目,用其他的方法计解决此类问题会比较棘手,所以希望通过这道题目可以帮助大家更好地理解动态规划的思想,谢谢。