经典问题。有n种硬币,每种硬币都有不同的价值,若需要组合出总价值m,问有多少种组合方式。 这题中限制硬币价值都是平方数。 用母函数写出来的代码和我用DP写出来的代码长一个样子。 #include <iostream> using namespace std; int c1[305],c2[305],add[18]; void init() { for(int i=1;i<=17;i++) { add[i]=i*i; } } int solve(int n) { memset(c1,0,sizeof(c1));//c1[k],c2[k]表示展开式中x^k的系数 memset(c2,0,sizeof(c2)); c1[0]=c2[0]=1; for(int i=1;i<=17;i++)//使用前i种币时的情况,也即母函数展开前i个多项式的乘积 { for(int j=0;j<n;j++)//求新的多项式中的系数 { for(int k=1;j+k*add[i]<=n;k++) { c2[j+k*add[i]]+=c1[j]; } } for(int k=0;k<=n;k++)//滚动数组 { c1[k]=c2[k]; } } return c1[n]; } int main() { int n; init(); while(scanf("%d",&n)&&n) { printf("%d/n",solve(n)); } return 0; }