题意:给出一个数n(1<=n<=60000),这个数可以写成一些数的平方的和,
问对于n,最少可以分成多少个数的平方的和。
比如:n=344,则344=18*18+4*4+2*2,输出3.
dp[i]表示i这个数最少可以分成多少个数的平方的和。
则遍历一边。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 6 using namespace std; 7 8 const int maxn=60000+3; 9 const int inf=0x3f3f3f3f; 10 11 int dp[maxn]; 12 13 int main() 14 { 15 dp[0]=0; 16 dp[1]=1; 17 dp[2]=2; 18 dp[3]=3; 19 dp[4]=1; 20 for(int i=5;i<maxn;i++) 21 { 22 dp[i]=inf; 23 24 for(int j=1;j*j<=i;j++) 25 { 26 dp[i]=min(dp[i],dp[i-j*j]+1); 27 } 28 } 29 30 int n; 31 32 while(scanf("%d",&n)!=EOF) 33 { 34 printf("%d\n",dp[n]); 35 } 36 37 return 0; 38 }