完美平方

題目:

給一個正整數 n, 找到若干個徹底平方數(好比1, 4, 9, ... )使得他們的和等於 n。你須要讓平方數的個數最少。code

樣例:

給出 n = 12, 返回 3 由於 12 = 4 + 4 + 4。
給出 n = 13, 返回 2 由於 13 = 4 + 9。it

思路:

採用動態規劃的思想:
一個數x能夠表示爲一個任意數$a$加上一個平方數$b*b$,也就是$x=a+b*b$;
$dp[a]$就是和獲得$a$須要的最少平方數;
$dp[b*b]$的值是$1$$。io

參考答案:

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];
    }
};
相關文章
相關標籤/搜索