题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1398
题目大意:有硬币面值为平方数,最大是17^2.输入m,问零钱组合成m元有多少种方法。
关键思想:组合问题。普通母函数
代码如下:
#include <iostream> #include <memory.h> using namespace std; int A[1000],B[1000]; //具体分析最坏情况 int main(){ int m; int v[18]; //每种物品的数量和价值 for(int i=0;i<18;i++){ v[i]=i*i; } while(~scanf("%d",&m)&&m){ memset(A,0,sizeof(A)); memset(B,0,sizeof(B)); for(int i=0;i<=m;i+=v[1])A[i]=1;//初始化第一个多项式 for(int i=2;i<=17;i++){ for(int j=0;j<=300;j++){ for(int k=0;k<=300;k+=v[i]){//可以优化,如k+j<=m B[j+k]+=A[j];//指数型A[j]改为A[j]/fac[k] } } for(int j=0;j<=300;j++){ A[j]=B[j],B[j]=0;//更新A数组 } } cout<<A[m]<<endl; } return 0; }