母函数-CSDN博客

35 阅读1分钟

Holding Bin-Laden Captive!母函数应用,虽然有简便解法

#include <iostream>
using namespace std;
const int maxn = 8000 + 7;
long long c1[maxn], c2[maxn];
int main()
{
	int ary[] = { 0, 1, 2, 5 };
	int n[10];
	while (cin >> n[1] >> n[2] >> n[3]) {
		if (!(n[1] | n[2] | n[3]))
			break;
		int maxV = 0;
		for (int i = 1; i <= 3; ++i)
			maxV += ary[i] * n[i];
		for (int i = 0; i <= n[1]; ++i) {
			c1[i] = 1;
			c2[i] = 0;
		}
		for (int i = n[1] + 1; i <= maxV; ++i) {
			c1[i] = c2[i] = 0;
		}
		//指数指的是钱币能支付的值 
		for (int i = 2; i <= 3; ++i) {
			for (int j = 0; j <= ary[i] * n[i]; j += ary[i]) {
				for (int k = 0; k + j <= maxV; ++k) {
					c2[j + k] += c1[k];
				}
			}
			for (int j = 0; j <= maxV; ++j) {
				c1[j] = c2[j];
				c2[j] = 0;
			}
			
		}
		int i;
		for (i = 1; i <= maxV; ++i)
			if (c1[i] == 0) {
				cout << i << endl;
				break;
			}
		if (i > maxV)
			cout << i << endl;
	}

	return 0;
}

c2存每步计算后的表达式,然后赋值给c1,c2置零,迭代。

最后c1[i]的i为表示式的质数,c1[i]的值为表示式的系数


hdu1028

#include <stdio.h>
#define N 120
int c1[N + 1], c2[N + 1]; 
int main()
{
	int n, i, j, k;
	while(~scanf("%d", &n)) {
		for (int i= 0; i <= n; ++i) {
			c1[i] = 1;
			c2[i] = 0;
		}
		for ( i = 2; i <= n; ++i) {
			for ( j = 0; j <= n; j += i) {
				for ( k = 0; k + j <= n; ++k) {
					c2[j + k] += c1[k];
				}
			}
			for ( j = 0; j <= n; ++j) {
				c1[j] = c2[j];
				c2[j] = 0;
			}
		}
		printf("%d\n", c1[n]);
	}
	
	return 0;
}


\

\