一般流通中有八个硬币:
1p,2p,5p,10p,20p,50p,$ 1(100p)和$ 2(200p)。
可以通过以下方式赚取2美元: 1x $ 1 + 1x50p + 2x20p + 1x5p + 1x2p + 3x1p
使用任意数量的硬币可以用3种不同的方式制作3美元?
我们怎样才能使用PHP?
答案 0 :(得分:5)
使用generating functions可以最好地解决此问题和类似问题。
对于这种情况,您要考虑表单的条款
1/(1 - x^k) = 1 + x^k + x^(2k) + x^(3k) + ...
其中k
是其中一个值1p, 2p, 5p, 10p, 20p, 50p, 100p, 200p
。现在将所有这8个术语相乘得到
f(x) = 1 / [ (1-x) * (1-x^2) * (1-x^5) * ... * (1-x^200) ]
然后x^m
的系数恰好是从给定面额中mp
的方式。例如,x^200
的系数为6
,这对应于从给定面额中获得6
的确切200p = $2
种方式的事实。
这是一个快速而肮脏的解释,说明为什么这样做。 x^m
中f(x)
的系数是从分母中x^(i*k)
形式的每个线性因子中取(1 - x^k)
形式的一个项的方式的数量,以便总和指数是m
,即
i1*k1 + i2*k2 + ... + i8*k8 = m
现在,k1 = 1
的字词对应于1p
,k2 = 2
的字词对应2p
,k3=5p
的字词对应5p
{1}},等等。上面的总和成为
i1*(1p) + i2*(2p) + i3*(5p) + ... + i8*(200p) = m
给出每种面额的金额。