题目
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
解析
注意这道题求的是,最小数量,所以和上一道题是有一点相似之处的,来一波动规五部曲:
1.确定dp数组(dp table)以及下标的含义
dp[j]:和为j的完全平方数的最少数量为dp[j]
2.递推公式
dp[j] = min(dp[j - i * i] + 1, dp[j]);
3.初始化
dp[0] = 0 即和为0的完全平方数最小数量是0
和上一道题一样,其余值要初始化为最大值
4.遍历顺序,先背包再物品
func numSquares(n int) int {
dp := make([]int, n+1) // 其实n就是背包
dp[0] = 0
for i := 1; i < n+1; i++ {
dp[i] = math.MaxInt32
}
for i := 1; i <= n; i++ { // 先遍历背包,0没有遍历的必要了
for j := 1; j <= i; j++ { // 遍历物品,注意终止条件,如果直接写小于n的话会超时
if i >= j*j {
dp[i] = min(dp[i], dp[i-j*j]+1)
}
}
}
return dp[n]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}