问题链接:https://leetcode.com/problems/perfect-squares/
十分有趣的一个问题,求出目标数的完全平方数和分解,使得和式的完全平方数数量最小。这个问题该从什么地方入手呢?这是一个目标和搜索问题,因此搜索范围的确定极其重要,搜索范围的最大值应该小于等于小于等于目标值的最大完全平方数,最小值为1,因此可以使用一个数组来存储这些完全平方数,然后进行递归搜索,注意递归的返回条件。
class Solution {
public static int[] squares;
public static int ret;
public int numSquares(int n) {
int number=(int)Math.sqrt(n);
ret=Integer.MAX_VALUE;
squares=new int[number+1];
for(int i=1;i<=number;i++)
{
squares[i]=i*i;
}
recursive(number,n,0);
return ret;
}
public static void recursive(int idx,int sum,int count)
{
if(sum<0)
return;
if(sum==0)
{
ret=Math.min(ret,count);
return;
}
if(count>=ret)
return;
for(int i=idx;i>=1;i--)
recursive(i,sum-squares[i],count+1);
}
}