解题思路:该题目与Coin Change很相似,先找出到n为止的所有的完全平方数,然后暴力法进行搜索。当然,
可以继续优化为动态规划。
int[][] memo = null; // 备忘录
public int sovle(int n, int [] squares, int idx)
{
if (n == 0) // 找到一种组合
return 0;
if (n < 0)
return 9999; // 返回较大的数,表示组合失败
if (idx == squares.length)
return 9999; // 返回较大的数,表示组合失败
// 如果计算过
if (memo[idx][n] != 0)
return memo[idx][n];
memo[idx][n] = Math.min(sovle(n-squares[idx], squares, idx) + 1,
sovle(n, squares, idx + 1));
return memo[idx][n];
}
public int numSquares(int n)
{
int len = (int) Math.sqrt(n);
int[] squares = new int[len];
// 计算n之前的所有完全平方数
for (int i=1; i<=squares.length; i++)
{
squares[i-1] = i * i;
}
// 初始化备忘录
memo = new int[len+1][n+1];
return sovle(n, squares, 0);
}