题目描述
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例 2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
题目分析
首先我们用dp来表示当前数由完全平方数构成的最小个数
- 当数字i本身是完全平方数 的时候
dp[i] = 1
- 否则
i = k*k + b
,也就是说 他一定等于某个数的平方 + 某个数 - 由此 我们将上式进行变形,
dp[i] = dp[i-k*k] +1
,下面解释一下为何变形成这个 - 因为第2条,我们知道可以把一个数拆分成 kk 和 b,又根据第一条,kk转换为dp[k] = 1,所以dp[b] = dp[i-k*k]
由此我们得出了我们的递推公式
dp[i] = dp[i-k*k] +1
代码实现