i+j*j
可以从i
加上j*j
得到,也就是和为i的完全平方数的个数+1
当然每个数都有不同的组合,因此要求最小的。
比如12 = 3+9 = 8+4 = 11+1
也就是dp[12] = min(dp[3]+1,dp[8]+1,dp[11]+1)
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
dp[0]=0;
for(int i=0;i<=n;i++){
for(int j=1;i+j*j<=n;j++){
dp[i+j*j]=min(dp[i+j*j],dp[i]+1);
}
}
return dp.back();
}