解题思路
这题也是完全背包问题,看看这个容量能被多少个装满而且要最少。一开始思路可能是直接给个最接近的完全平方数,然后对剩下的差值进行组装,因为动态规划的原因可以直接知道这个差值用的最少数量。问题就出在这个差值上面,差值有多有少,可能差值太多导致这个n组成要用掉很多完全平方数。
既然肯定要组装,那就把比它小的完全平方数都遍历一遍然后看看和差值组成数量的和哪个最小(这样就包含了全部情况但也没包含全部情况)。因为n可能刚刚好就是一个完全平方数,所以这里最好把可能等于这个n的情况也算上,差值组成为0,所以是把比它小或等于的完全平方数都遍历一遍。
代码示例
func numSquares(n int) int {
dp:=make([]int,n+1)
for i:=1;i<=n;i++{
dp[i]=math.MaxInt32
for j:=1;j*j<=i;j++{
if i-j*j<0{
continue
}
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
}