我正在尝试实施一个硬币问题,问题说明是这样的
创建一个函数来计算可用于给定数量的所有可能的硬币组合。
All possible combinations for given amount=15, coin types=1 6 7
1) 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2) 1,1,1,1,1,1,1,1,1,6,
3) 1,1,1,1,1,1,1,1,7,
4) 1,1,1,6,6,
5) 1,1,6,7,
6) 1,7,7,
函数原型:
int findCombinationsCount(int amount, int coins[])
假设硬币数组已排序。对于上面的例子,这个函数应该返回 6。
任何人指导我如何实现这个?
原文由 Preetam Purbia 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用生成函数方法给出使用复数的快速算法。
给定硬币值c1,c2,..,ck,求和n的方法数,你需要的是x^n的系数
这与在中找到 x^n 的系数相同
现在使用复数,x^a - 1 = (x-w1)(x-w2)…(x-wa) 其中 w1、w2 等是单位的复根。
所以
可以写成
可以使用部分分数重写为
这里面x^n的系数很容易找到:
计算机程序应该能够轻松找到 Ai 和 ai(可以是复数)。当然,这可能涉及浮点计算。
对于大 n,这可能比枚举所有可能的组合更快。
希望有所帮助。