class Solution {
public int numSquares(int n) {
// 1.确定dp数组 dp[j]代表装满容量为j的背包,需要n的完全平方数最少数量
int[] dp = new int[n+1];
// 2.递推关系 dp[j] = Math.min(dp[j],dp[j-i*i]+1);
// 3.初始化
dp[0] = 0;
for(int i=1; i<n+1; i++){
dp[i] = Integer.MAX_VALUE;
}
// 4.遍历顺序 先遍历物品,再遍历背包 或者 先遍历背包,再遍历物品
// 物品是完全平方数
for(int i=1; i*i<=n; i++){
for(int j=i*i; j<=n; j++){
if(dp[j-i*i] != Integer.MAX_VALUE){
dp[j] = Math.min(dp[j],dp[j-i*i]+1);
}
}
}
return dp[n];
}
}
运行结果: