279. 完全平方数

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量
输入:n = 13
输出:2
解释:13 = 4 + 9

  1. //完全背包问题,自顶向下=爬楼梯 时间n*根号n,空间On
  2. func numSquares(amount int) int {
  3. dp := make([]int ,amount + 1)
  4. dp[0] = 0
  5. //明确第一个循环,取的是 0-amount 的最小平方数个数,遍历平方和,最坏情况是都用1来组成;
  6. //第二个循环求每层+累加 i的最小平方数个数=dp[amount]
  7. for i := 1; i <= amount; i++ { //amount 需要的钱大小
  8. dp[i] = amount + 1 //边界条件,最大可能值,总的值+1,反正取个最大的完事,从最大开始缩写
  9. //dp[i] = math.MaxInt32
  10. for coin := 0; coin * coin <= i; coin++ {
  11. dp[i] = min(dp[i], dp[i - coin * coin ] + 1) //核心,状态转移方程== 函数表达式
  12. }
  13. }
  14. return dp[amount]
  15. }
  16. func min(x, y int) int {
  17. if x < y {
  18. return x
  19. }
  20. return y
  21. }