题目描述

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。

题目问个数最少是多少个,这种只求结果不需要过程的就采用动态规划。
dp[i]表示 和等于i时需要的最小的完全平方数的个数
dp[i]=min(dp[i-j*j]+1) j属于(1,(根号n))
易错点是注意 当遇到平方数时,dp[i]=0,可以放在外面单独判断,或者等第二个for循环走到最后,j=sqrt(i),为1

class Solution {
public:
    int numSquares(int n) {
        int MAX=n+1;
        vector<int> dp(n+1,MAX);
        dp[0]=0;
        for(int i=1;i<=n;i++)
        {            
            for(int j=1;j<=sqrt(i);j++)//当j*j=i,即i是平方根时候,dp[i]=dp[0]+1;
            {
                dp[i]=min(dp[i],dp[i-j*j]+1);//dp[n]=min(dp[n-i*i]+1) i属于(1,(根号n))
            }
        }
        return dp[n];
    }
};

独立做出的第一道动态规划的题 开心开心开心