LintCode 完美平方

207 阅读1分钟

题目

给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。

样例 给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。 给出 n = 13, 返回 2 因为 13 = 4 + 9。

分析

动态规划,dp[i]表示n=i时,最小的个数。 显然可以求出dp值为1的值,并以此进行判断

代码

public class Solution {
    /**
     * @param n a positive integer
     * @return an integer
     */
    public int numSquares(int n) {
        // Write your code here
        int[] dp = new int[n+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        
        for(int i=0;i*i<=n;i++) {
        	dp[i*i] = 1;
        }
        
        for(int i=1;i<=n;i++) {
        	for(int j=1;j*j<=i;j++) {
        		dp[i] = Math.min(dp[i], dp[i-j*j]+1);
        	}
        }

        return dp[n];
    }
}