
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();
}
本文介绍了一种求解将正整数表示为若干个完全平方数之和的最少数量的算法。通过动态规划方法,利用一维数组dp存储从0到n的所有数值的最优解,实现了高效求解。

被折叠的 条评论
为什么被折叠?



