比较简单/有技巧的dp
如果 for每个钱数
for 每个物品的话是会有重复的{1,2,2}{2,1,2}
如果把两种倒过来就可以很好的消除重复的情况
#include<bits/stdc++.h>
using namespace std;
long long f[400];
int w[20];
void preGao()
{
for (int i=1;i<=17;i++)
w[i]=i*i;
memset(f,0,sizeof(f));
f[0]=1;
for (int j=1;j<=17;j++)
for (int i=1;i<=300;i++)
if (i>=w[j])
f[i]+=f[i-w[j]];
}
int main()
{
//freopen("a.in","r",stdin);
preGao();
int n;
while (cin>>n && n)
cout<<f[n]<<endl;
return 0;
}