题目描述
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例 2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
思路——动态规划
状态: F(n) 表示 若干个完全平方数的和等于n,所得完全平方数的最少个数.
转移方程: F(n) = 1 + min(F(n - i)) 1<=i <=n,其中i是平方数
。
数组表示如下:
memory[i] = min(memory[i],1 + memory[i - j])
其中如果memory[i]为初始状态时,直接:memory[i] = 1 + memory[i - j])。
代码如下:
class Solution {
public int numSquares(int n) {
int[] memory = new int[n + 1];
for(int i = 1;i <= n;i++){
for(int j = 1;j <=i;j++){
int sqr = j*j;
if(sqr <= i){
if(memory[i] == 0){
memory[i] = 1 + memory[i - sqr];
}else{
memory[i] = Math.min(memory[i],1 + memory[i - sqr]);
}
}
}
}
return memory[n];
}
}