LeetCode279.给你一个整数 n ,返回和为n的完全平方数的最少数量。
示例1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
首先确定状态,由于n是多个平方数之和,所以最后一个和数肯定是平方数,所以求n-j^2最少被分为几个平方数之和是子问题。由此得到状态:设f[i]表示i最少被分为几个平方数之和。
接着确定状态方程f[i]=f[i-j^2] + 1(1 <= j^2 <= i)
最后确定初始状态和边界条件,f[0]=0,因为0是0个平方数之和;结果需要计算f[n]。
代码如下:
public int numSquares(int n) {
int[] f = new int[n + 1];
f[0] = 0;
for (int i = 1; i <= n; i++) {
f[i] = Integer.MAX_VALUE;
for (int j = 1; j * j <= i; j++) {
if (f[i - j * j] + 1 < f[i]) {
f[i] = f[i - j * j] + 1;
}
}
}
return f[n];
}