题目链接
举个例子13
很显然产生了重复子结构
这里我们的dp保存的是构成i的最少的个数
那么对于每个数来说,要么选他本身要么选他本身-他的倍数
所以有
dp[i]=Math.min(dp[i-j*j]+1,dp[i]);
public int numSquares(int n) {
int[] dp=new int[101010];
for(int i=0;i<101010;i++){
dp[i]=9999999;
}
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j*j<=i;j++){
dp[i]=Math.min(dp[i-j*j]+1,dp[i]);
}
}
return dp[n];
}