完全平方数

完全平方数

解题思路:该题目与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);
	}