cdoj1099

搜索加记录   

平方数

众所周知,一个正整数可以分成若干个正整数的和(废话),现在我们把问题改一下。把一个正整数分成若干个平方数的和,显然这也是一定可以达到的。例如8=4+4=2^2+2^2 41=4^2+5^2 3=1+1+1。但是现在试卷空格有限,不可能让你写n个1上去,所以我们需要最少的分拆。

#include <iostream>
#include <math.h>
using namespace std;
int base[320];
int ans[300];
int res[300];
int rlen;
int len;
int back(int n,int temp)
{
//cout<<"lsjdls"<<endl;
int i,j;
//int temp=(int)sqrt((double)n);
for(i=n/(temp*temp);i>=0;i--)
{
//cout<<temp<<endl;
//cin>>temp;
if(n==i*temp*temp)
{
//cout<<"first"<<endl;
len+=i;
int k;
if(len<=rlen)
{
rlen=len;
for(j=0;j<i;j++)
{
res[j]=temp;
}
for(k=len-1-i;k>=0;k--)
res[j++]=ans[k];
}
len-=i;
return 0;
}
else
{ //cout<<"second"<<endl;
for(j=1;j<=i;j++)
ans[len++]=temp;
back(n-i*temp*temp,temp-1);
len-=i;
}
}
return 0;
}
int main()
{
int i;
for(i=1;i<=320;i++)
{
base[i]=i*i;
}
int n;
while(cin>>n)
{
rlen=10000;
len=0;
int temp=(int)sqrt((double)n);
back(n,temp);
cout<<rlen<<endl;
for(i=0;i<rlen;i++)
{
cout<<res[i];
if(i<rlen-1)cout<<" ";
}
cout<<endl;
}
return 0;
}
原文地址:https://www.cnblogs.com/orangeblog/p/2426338.html