?
?
題意:給出一個數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 }
?