从第一个例子可以看出,贪心是不对的,必须使用动态规划,dp[i]表示凑成i最少的完全平方数的个数,需要从之前所以可以转移的数转移。
class Solution {
public:
int numSquares(int n) {
// dp[i] 表示凑成整数i最小的完全平方个数
// dp[i] = min(dp[i - j*j]) + 1
vector<int> f(n + 1, INT_MAX);
f[0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j * j <= i; j++) {
f[i] = min(f[i], f[i - j * j] + 1);
}
}
return f[n];
}
};