输入一个n,求若干个完全平凡数使他们的和为n,求最少的个数,这些数可以重复。
求最少个数,可以尝试用动态规划,若dp[n]表示n的完全平方数最少个数,
则dp[i]=dp[i-x]+1,x是一个n之前最大的完全平方数,所以对于每一个遍历的位置,都要遍历比它小的完全平方数、然后dp[i]和dp[i-x]+1,哪个小则用哪个。一直求到n。
在进入j之前要让dp[i]初始化为i,也就是最多是每个位置都是1.
要多设置一个,因为算第一个数时dp[1]=max(dp[1],dp[1-1*1]+1)
最小的完全平方数为1,所以要设置第一个为0
class Solution {
public int numSquares(int n) {
int[] dp=new int[n+1];
dp[0]=0;
for(int i=1;i<=n;i++){
dp[i]=i;
for(int j=1;i-j*j>=0;j++){
dp[i]=Math.min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
}