题目描述
给定正整数 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]; } };
独立做出的第一道动态规划的题 开心开心开心