题目描述:给你一个整数 n ,返回和为 n 的完全平方数的最少数量 。

方法1:动态规划,dp[i] = min(dp[i],dp[i-x]+1);x是任意小于n的完全平方数

class Solution {
public:
    int numSquares(int n) {
        vector<int> temp;
        int i=1;
        temp.push_back(0);
        while(i*i < n){
            temp.push_back(i*i);
            i++;
        }//存小于n的所有完全平方数
        vector<int> dp(n+1);//dp数组
        for(int i=0;i<dp.size();i++){
            dp[i] = i;
        }//初始化dp数组
        for(int i=1;i<dp.size();i++){
            for(int j=1;j<temp.size();j++){
                if(i < temp[j]) break;
                dp[i] = min(dp[i],dp[i-temp[j]]+1);
            }
        }
        return dp[n];
    }
};

无法通过所有样例,对本身就是完全平方数的样例会报错,原因:temp数组中的(i*i < n)应该改为(i*i <= n)

方法二:优化,可以不用创建数组存放完全平方数

class Solution {
public:
    int numSquares(int n) {
        vector<int> temp;
        int i=1;
        vector<int> dp(n+1);
        for(int i=0;i<dp.size();i++){
            dp[i] = i;
        }

        for(int i=1;i<dp.size();i++){
            for(int j=1;j*j <= i;j++){
                dp[i] = min(dp[i],dp[i-j*j]+1);
            }
        }
        return dp[n];
    }
};