使用任意数量的硬币可以有多少种不同的方式来制作3美元


How many different ways can $3 be made using any number of coins?

目前有八种硬币在流通:

1便士、2便士、5便士、10便士、20便士、50便士、1美元(100便士)和2美元(200便士)。

可以通过以下方式赚2美元:1x$1+1x50p+2x20p+1x5p+1x2p+3x1p

使用任意数量的硬币可以有多少种不同的方式制作3美元?

我们如何使用PHP来实现它?

这个问题和类似的问题最好使用生成函数来解决。

对于这种情况,您需要考虑形式的条款

1/(1 - x^k) = 1 + x^k + x^(2k) + x^(3k) + ...

其中CCD_ 1是值CCD_。现在将这8项相乘,得到

f(x) = 1 / [ (1-x) * (1-x^2) * (1-x^5) * ... * (1-x^200) ]

那么x^m的系数恰好是从给定面额中可以生成mp的方式的数目。例如,x^200的系数是6,这对应于从给定面额中获得200p = $26方法。


这里有一个快速而肮脏的解释为什么这是有效的。k0中的x^m的系数是从分母中形式为(1 - x^k)的每个线性因子中取形式为x^(i*k)的一项的方式的数目,使得指数之和为m,即

i1*k1 + i2*k2 + ... + i8*k8 = m

现在,k1 = 1的项对应于取1pk2 = 2的项对应着取2pk3=5p的项对应取5p,依此类推

i1*(1p) + i2*(2p) + i3*(5p) + ... + i8*(200p) = m

它给出了每种面额的金额。