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]的值为表示式的系数
#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;
}
\
\