class Solution {
public int numSquares(int n) {
//动态规划
//dp[i]表示装满容量为i的背包最少需要的数量
//公式dp[i] = min(dp[i - j*j]) + 1
//dp[i - j * j]表示减去j还剩下的最小数量,加上j用1表示就代表了dp[i]
int[] dp = new int[n + 1];
dp[0] = 0;
//因为dp[n]表示装满数量为n的背包所需要的数量,所以从1遍历到n
for(int i = 1; i <= n; i++){
int min = Integer.MAX_VALUE;
for(int j = 1; j * j <= i; j++){
min = Math.min(min,dp[i - j * j]);
}
dp[i] = min + 1;
}
return dp[n];
}
}