题目描述:
给定一个数字n,求它能由最少多少个平方数求和得到。(平方数:是某个数的平方)
- Example 1:
Input: n = 12
Output: 3
Explanation: 12 = 4 + 4 + 4.
- Example 2:
Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.
思路:
动态规划。dp[i] = j 表示 i 由最少 j 个平方和组成。
代码:
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 i=1; i<=n; ++i) {
for (int j=1; j*j<i; ++j) {
dp[i] = min(dp[i], dp[i-j*j] + 1);
}
}
return dp[n];
}
};
动态规划总是,想不到,一看就懂。菜是原罪。