题目大意为:有1,4,9,16……..289(17^2)共17中不同的硬币,问有几种方法组成所给的数字。
母函数模板请看我的另一篇文章:
http://blog.csdn.net/rcy_zhu/article/details/75041050
在这题上,可以轻易得出价值数组v[i]为每种硬币的面值;
共17种,所以K=17;
因为每种硬币无限,所n2[i]数组省略;
每种硬币可取可不取,所以n1[i]为0;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
#define ll long long
#define inf 0xfffffff
#define N 302
int a[N],b[N];
int v[N];
int main()
{
int n;
for(int i=1;i<=17;i++)
v[i]=i*i;
while(cin>>n&&n)
{
memset(a,0,sizeof(a));
a[0]=1;
for(int i=1;i<=17;i++)
{
memset(b,0,sizeof(b));
for(int j=0;j*v[i]<=n;j++)
{
for(int k=0;k+j*v[i]<=n;k++)
b[k+j*v[i]]+=a[k];
}
memcpy(a,b,sizeof(b));
}
cout<<a[n]<<endl;
}
}