d[s]:凑齐s值的方法数
d[s]=sum(d[s-i*i])
1=<i*i<=s
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int d[305];
memset(d,0,sizeof(d));
d[0]=1;
for (int i=1;i<=17;i++){
for (int s=i*i;s<=300;s++){
d[s]+=d[s-i*i];
}
}
while(scanf("%d",&n)!=EOF&&n){
printf("%d\n",d[n]);
}
return 0;
}