创新工场2013年校园招聘笔试题

1,有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?

母函数:


#include <iostream>

using namespace std;

int main()
{
	int n;
	int i, j, k;
	const int max = 1001;
	int c1[max], c2[max];	// c1是用来存放展开式的系数的,
							//c2是用来保存计算时的临时中间值的
	int coin[4] = {1, 2, 5, 10};

	while (cin>>n)
	{
		// 对于 1 + x + x^2 + x^3 + ... + x^n他们的所有系数都是1,所以c1所有值初始化为1;
		// c2是用来计算变化时的临时值,所以初始化为0
		for (i=0; i<=n; ++i)
		{
			c1[i] = 1;
			c2[i] = 0;
		}

		// 刚才已经计算过一次了,所以从i=1开始;
		// 这里i是指第i+1个表达式,母函数关系式里,每一个括号就是一个表达式
		for (i=1; i<4; ++i)
		{
			for (j=0; j<=n; ++j)
			{
				for (k=0; k+j<=n; k+=coin[i])
				{
					// 合并同类项,他们的系数相加
					c2[j+k] += c1[j];
				}
			}

			// 更新系数
			for (j=0; j<=n; ++j)
			{
				c1[j] = c2[j];
				c2[j] = 0;
			}
		}		
		cout<<c1[n]<<endl;
	}

	return 0;
}


你可能感兴趣的:(创新工场2013年校园招聘笔试题)