Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, …) which sum to n.
public int numSquares(int n) {
int[] ret = new int[n + 1];//对于一个数如何开状态空间?答案是如果需要计算这个数是如何组成的,那么需要开n+1的空间,因其每个组成部分都需要被考虑
Arrays.fill(ret, Integer.MAX_VALUE);//求最小值,显而易见要全放最大值
ret[0] = 0;
ret[1] = 1;
//dp[i] = min(dp[i - j * j] + 1)
for(int i = 1; i <= n; i++){
for(int j = 1; j * j <= i; j++){
ret[i] = Math.min(ret[i - j * j] + 1, ret[i]);//dp数组的索引就是值--每个组成部分,值存放的是计数值。这里是选一个组成方案的最小值
}
}
return ret[n];
}