题目描述

 

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

示例 1:

输入: n = 12
输出: 3 
解释: 12 = 4 + 4 + 4.

示例 2:

输入: n = 13
输出: 2
解释: 13 = 4 + 9.

 

解题思路

 

利用动态规划思想解题,初始化dp数组令小于n的完全平方数为1,从1到n遍历求解最小组成个数,再对每个数遍历小于其的所有完全平方数,最小组成个数的状态转移方程为:

dp[i] = min(dp[i], dp[i - j * j] + 1)

 

代码

 

 1 class Solution {
 2 public:
 3     int numSquares(int n) {
 4         vector<int> dp(n + 1, INT_MAX);
 5         for(int i = 1; i * i <= n; i++)
 6             dp[i * i] = 1;
 7         for(int i = 1; i <= n; i++)
 8             for(int j = 1; j * j < i; j++)
 9                 dp[i] = min(dp[i], dp[i - j * j] + 1);
10         return dp[n];
11     }
12 };

 

相关文章:

  • 2021-08-30
  • 2022-01-21
  • 2022-12-23
  • 2021-09-11
猜你喜欢
  • 2021-09-18
  • 2021-11-07
  • 2022-12-23
  • 2022-01-22
  • 2021-08-17
  • 2021-11-29
  • 2021-10-04
相关资源
相似解决方案