求组成一个数所需要最少的平方数的个数
方法一(动态规划)
int dp[N];
for(int i=1;i<=n;i++){
dp[i]=dp[i-1]+1;
for(int j=1;j*j<=i;j++){
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
方法二(数学)(四平方和定理)
四平方和定理证明了任意一个正整数都可以被表示为至多四个正整数的平方和。
int check(int x){
int mid=x;
if(x==(int)sqrt(x)*sqrt(x))return 1;
while(x%4==0)x/=4;
if(x%8==7)return 4;
for(int i=1;i*i<=mid;i++){
int j=mid-i*i;
if((int)sqrt(j)*sqrt(j)==j)return 2;
}
return 3;
}