题目:
给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
样例:
给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。
给出 n = 13, 返回 2 因为 13 = 4 + 9。
思路:
采用动态规划的思想:
一个数x可以表示为一个任意数$a$加上一个平方数$b*b$,也就是$x=a+b*b$;
$dp[a]$就是和得到$a$需要的最少平方数;
$dp[b*b]$的值是$1$$。
参考答案:
class Solution {
public:
/*
* @param n: a positive integer
* @return: An integer
*/
int numSquares(int n) {
// write your code here
if(n == 0) return 0;
vector<int> dp(INT16_MAX, n+1);
for(int i=0; i*i<=n; i++){
dp[i*i] = 1;
}
//动态规划;一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a+bxb
for(int i=1; i<n; i++){
for(int j=1; j*j+i<=n; j++){
dp[i+j*j] = min(dp[i]+1, dp[j*j+i]);
}
}
return dp[n];
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。