1.题目
给定正整数n,最少的平方数(例如,1,4,9,16 ......)使它们和为n。
示例:
Input: n =12
Output: 3 Explanation:12 = 4 + 4 + 4.
2.思路
用动态规划的思想解决问题。
dp[n] 表示最少的平方数
i*i本身就是一个完美平方数,所以dp[i*i] = 1
一个数字x = j + i*i
如果一个数x可以表示为一个任意数j加上一个平方数i*i,也就是x = j + i*i,
那么能组成这个数x最少的平方数个数,就是能组成j最少的平方数个数加上1(因为i*i已经是平方数了)。
min(dp[j] + 1, dp[x = j + i*i])
x可能本身是个平方数。
3.实现
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
for(int i = 1;i*i <= n;i++)
dp[i*i] = 1;
for(int x = 1; x <= n; x++)
for(int i = 1; x - i * i > 0; i++)
dp[x] = min(dp[x], dp[x - i * i] + 1);
return dp[n];
}
};