目前有八种硬币在流通:
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 = $2
的6
方法。
这里有一个快速而肮脏的解释为什么这是有效的。k
0中的x^m
的系数是从分母中形式为(1 - x^k)
的每个线性因子中取形式为x^(i*k)
的一项的方式的数目,使得指数之和为m
,即
i1*k1 + i2*k2 + ... + i8*k8 = m
现在,k1 = 1
的项对应于取1p
,k2 = 2
的项对应着取2p
,k3=5p
的项对应取5p
,依此类推
i1*(1p) + i2*(2p) + i3*(5p) + ... + i8*(200p) = m
它给出了每种面额的金额。