题目
思路
通过上面的树形图,正整数n可以分为某个完全平方数加上另外一个正整数,比如:12=1+11,或者12=4+8,12=9+3,我们设组成一个正整数最少的完全平方数为num[i],那么组成12的完全平方数最少平方数num[12]=min(num[11],num[8],num[3])+1,这样就会产生很多的子问题
所以该题的动态规划方程为:
设组成正整数n的最少完全平方数的个数为dp[n],则dp[n]=min(dp[n-11],dp[n-22],dp[n-33],……dp[n-jj])+1,其中要保证n-j*j>=0,
代码如下:
class Solution {
public:
int numSquares(int n) {
if(n<4) return n;
vector<int> dp(n+1);
for(int i=1;i<=n;i++){
for(int j=1;i-j*j>=0;j++){
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
};