HDU 1398 [Square Coins]母函数

题目链接: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;
} 
  

  

    原文作者:哇咔咔咔
    原文地址: https://www.cnblogs.com/G-M-WuJieMatrix/p/6738276.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞