HDU-1082 排列组合 普通生成函数 细节
HDU - 1082 排列组合 普通生成函数 细节
HDU 1082 Holding Bin-Laden Captive!
题意
给\(n_1\) 给一元硬币,\(n_2\)个两元硬币,\(n_3\) 个5元硬币。从中选择硬币,问能够构成的最小的硬币面值是多少
分析
显然可以从普通生成函数的角度考虑,把生成的面值等价成\(x\)的指数部分,这里注意的细节是应该先计算出可能的最大价值作为循环的上界。最后遍历一下哪个系数为0就行了。
代码
int c1[10005];
int c2[10005];
int a[3];
int main() {
while (~scanf("%d%d%d", &a[0], &a[1], &a[2])) {
if (a[0] == a[1] && a[1] == a[2] && !a[0]) break;
memset(c1, 0, sizeof c1);
memset(c2, 0, sizeof c2);
c1[0] = 1;
int f;
int sum = a[0] + 2 * a[1] + 5 * a[2];
for (int i = 0; i < 3; i++) {
if (!i) f = 1;
else if (i == 1) f = 2;
else f = 5;
for (int j = 0; j <= sum; j++)
for (int k = 0; k <= a[i] && (k * f + j) <= sum; k++)
c2[j + k * f] += c1[j];
for (int j = 0; j <= sum; j++) c1[j] = c2[j], c2[j] = 0;
}
int ans = -1;
for (int i = 1; i <= sum; i++) if (!c1[i]) {
ans = i;
break;
}
printf("%d\n", ans);
}
}