import java.util.*;
/**
* NC292 最少的完全平方数
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
public int numSquares (int n) {
return solution(n);
}
/**
* 动态规划
*
* dp[i]表示和为i的最少完全平方数的个数
*
* { 1 , i=square*square
* dp[i] = {
* { Math.min(dp[i], dp[j]+dp[i-j]) , 1<=j<=i/2
*
* @param n
* @return
*/
private int solution(int n){
int[] dp = new int[n+1];
Arrays.fill(dp, Integer.MAX_VALUE);
int square;
for(int i=1; i<=n; i++){
square = (int)Math.sqrt(i);
if(i == square*square){
dp[i] = 1;
}else{
for(int j=1; j<=i/2; j++){
dp[i] = Math.min(dp[i], dp[j]+dp[i-j]);
}
}
}
return dp[n];
}
}