题目地址
https://leetcode-cn.com/problems/perfect-squares/
解题思路
n = 12
先把 n 减去一个平方数,然后求剩下的数分解成平方数和所需的最小个数
把 n 减去 1, 然后求出 11 分解成平方数和所需的最小个数,记做 n1
那么当前方案总共需要 n1 + 1 个平方数
把 n 减去 4, 然后求出 8 分解成平方数和所需的最小个数,记做 n2
那么当前方案总共需要 n2 + 1 个平方数
把 n 减去 9, 然后求出 3 分解成平方数和所需的最小个数,记做 n3
那么当前方案总共需要 n3 + 1 个平方数
下一个平方数是 16, 大于 12, 不能再分了。
接下来我们只需要从 (n1 + 1), (n2 + 1), (n3 + 1) 三种方案中选择最小的个数,
此时就是 12 分解成平方数和所需的最小个数了
至于求 11、8、3 分解成最小平方数和所需的最小个数继续用上边的方法去求
直到如果求 0 分解成最小平方数的和的个数, 返回 0 即可
代码
class Solution {
public:
int numSquares(int n) {
if(n<=0){
return -1;
}
vector<int> dp(n+1,INT_MAX);
dp[0]=0;
for(int i=1;i<=n;i++){
dp[i]=i;//最坏的全是1
for(int j=1;j*j<=i;j++){
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
};