给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
1、题目分析
从题目的提问方式,能够很明显的看出这是个最值类型的动态规划。
2、确定状态
最后一步:关注最后策略中最后一个完全平方数j*j;最后策略中n-j*j也一定被划分成最少的完全平方数之和。
因此我们可以假设f[i]表示i最少被分成几个完全平方数之和
3、转移方程
假设f[i]表示i最少被分成几个完全平方数之和
4、初始条件和边界情况
初始条件:0被分成0个完全平方数之和,f[0]=0
5、计算顺序
从小到大,答案是f[N ]
6、代码实现
class Solution:
def numSquares(self, n: int) -> int:
square_nums = [i**2 for i in range(0, int(math.sqrt(n))+1)]
dp = [float('inf')] * (n+1)
dp[0] = 0
for i in range(1, n+1):
for square in square_nums:
if i < square:
break
dp[i] = min(dp[i], dp[i-square] + 1)
return dp[-1]