描述 给定正整数n,找到若干个完全平方数(比如1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例1: 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4. 示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9. 思路 动态规划 1. 找公式 dp[i] 表示i的完全平方数的最少个数 因为求的是最少完全平方数 dp[i] 可以表示为 dp[i-j*j] + 1 我们只需要 遍历j j*j <= i 找出dp[i-j*j]的最小值 即为dp[i]的最小值 公式: dp[i] = dp[i-j*j] + 1 2. 初始值 dp[i]的最坏情况为i 实现 func numSquares(n int) int { dp := make([]int, n+1) dp[0] = 0 for i:=0; i <= n; i++{ dp[i] = i for j := 1; i - j*j >= 0; j++{ dp[i] = Min(dp[i], dp[i-j*j] + 1) } } return dp[n] } func Min(a, b int) int { if a >= b { return b } else { return a } }