题目:

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

样例:

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

思路:

采用动态规划的思想:
一个数x可以表示为一个任意数$a$加上一个平方数$b*b$,也就是$x=a+b*b$;
$dp[a]$就是和得到$a$需要的最少平方数;
$dp[b*b]$的值是$1$$。

参考答案:

class Solution {
public:
    /*
     * @param n: a positive integer
     * @return: An integer
     */
    int numSquares(int n) {
        // write your code here
        if(n == 0)  return 0;
        vector<int> dp(INT16_MAX, n+1);
        for(int i=0; i*i<=n; i++){
            dp[i*i] = 1;
        }
        
        //动态规划;一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a+bxb
        for(int i=1; i<n; i++){
            for(int j=1; j*j+i<=n; j++){
                dp[i+j*j] = min(dp[i]+1, dp[j*j+i]);
            }
        }
        return dp[n];
    }
};

wydong
40 声望5 粉丝

wyd


« 上一篇
丑数
下一篇 »
数字整除数