现在的位置: 首页 > 综合 > 正文

母函数 (每种邮票无限用,求n分的表达种数)

2013年06月18日 ⁄ 综合 ⁄ 共 675字 ⁄ 字号 评论关闭
/*
         计算用 1、2、3分的邮票组合成 nNum分有 c1[nNum]种情况 (即 X^nNum的系数为多少)
注意 !!!:  该代码仅适用于 每种邮票使用次数不限 
         第一个for是:代表 第 i个括号里的多项式 ,第 i个括号代表 i分的邮票情况,即括号中 X^(i的倍数) 
         第二个for,因为从左向右计算,所以每次算完一个括号 就将结果用 c1[]存起来,当再与另一个括号相乘时
		 每次 c1[j]里的系数都加 i,即此时计算所得为X^(j+k)的系数。
		 
		 利用中间数组c2[]的原因是:每次进行括号相乘时,X的系数不是按顺序进行,所以 不能仅用 c1[]完成操作,
		 因为不能保证前一次的计算 c[j+k] 没有改变此时的 c[k]; 
		 
		 参考:  http://www.wutianqi.com/?p=596 

*/
#include<iostream>
using namespace std;
int main()
{
	int c1[1001],c2[1001];
	int nNum;
	while (scanf("%d",&nNum)!=EOF)
	{
		for(int i=0;i<=nNum;i++)  {c1[i]=1;  c2[i]=0; }
		for(int i=2;i<=nNum;i++)
		{
			for(int j=0;j<=nNum;j++)
			{
				for(int k=0;k+j<=nNum;k+=i)
				{
					c2[j+k]+=c1[j];
				}
			}
			for(int j=0;j<=nNum;j++)
			{
				c1[j]=c2[j];
				c2[j]=0;
			}
		}
		printf("%d\n",c1[nNum]);
	}
	return 0;
}


参考博客:  http://www.wutianqi.com/?p=596



抱歉!评论已关闭.