TImus 1073 Square Country DP

 

 

题意:给出一个数n(1<=n<=60000),这个数可以写成一些数的平方的和,

   问对于n,最少可以分成多少个数的平方的和。

   比如:n=344,则344=18*18+4*4+2*2,输出3.

 

dp[i]表示i这个数最少可以分成多少个数的平方的和。

 

则遍历一边。

 

TImus 1073 Square Country DP
 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 }
View Code

 

你可能感兴趣的:(count)