本文共 1722 字,大约阅读时间需要 5 分钟。
给定1元、2元、5元硬币的数量,求无法用这些硬币组成的最小数。
作为初学者,你可能对生成函数(母函数)不太熟悉。母函数是一种强大工具,用于解决组合问题。这里,我们将通过母函数的方法来求解无法用硬币组成的最小数。
母函数是多项式生成的工具,每个硬币面额的生成函数可以表示为一个无穷级数。对于给定的硬币数量a、b、c,三个生成函数分别为:
将这三个母函数相乘,可以得到所有可以用这些硬币组成的数目的母函数。
总母函数M(x) = [1 + x + x² + ... + xᵃ] × [1 + x² + x⁴ + ... + x²ᵇ] × [1 + x⁵ + x¹⁰ + ... + x⁵ᶜ]
这个多项式展开后,每一项xᵏ的系数表示可以用a个1元,b个2元,c个5元硬币组成数k的最小数量方法。系数为0的项对应的k则是我们无法用这些硬币组成的数。
[以下为伴随说明内容,但本内容仅供参考,请勿违反规则复制]
#include#include #include #include using namespace std;int c1[10000], c2[10000];int main() { int a, b, c; while (cin >> a >> b >> c) { if (a == 0 && b == 0 && c == 0) break; if (a == 0) { printf("1\n"); } else if (a + 2 * b < 4) { printf("%d\n", a + 2 * b + 1); } else { printf("%d\n", a + 2 * b + c * 5 + 1); } } return 0;}
初始化两个辅助数组c1和c2。
生成前两个生成函数:
合并前两个生成函数:
生成第三个生成函数(5元硬币)并与c1相乘:
查找最小不可表示数:
输出结果。
[经过多次测试和验证,得到以下伪代码结果]
输入: a, b, c输出: 无法用硬币组成的最小数
[注:此处应启用伪代码输出,例如:]
int c1[10000], c2[10000];int main() { int a, b, c; while (cin >> a >> b >> c) { if (a == 0 && b == 0 && c == 0) break; // 初始化 if (a == 0) { cout << 1 << endl; continue; } // 处理问题 // ... // 最终输出无法用硬币组成的最小数 cout << min_num << endl; } return 0;}
通过上述方法,我们可以有效地找到无法用给定硬币组成的最小数。
转载地址:http://swaoz.baihongyu.com/