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

时间:2012-01-12 06:22:28

标签: php arrays algorithm

一般流通中有八个硬币:

1p,2p,5p,10p,20p,50p,$ 1(100p)和$ 2(200p)。

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

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

我们怎样才能使用PHP?

1 个答案:

答案 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^mf(x)的系数是从分母中x^(i*k)形式的每个线性因子中取(1 - x^k)形式的一个项的方式的数量,以便总和指数是m,即

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

现在,k1 = 1的字词对应于1pk2 = 2的字词对应2pk3=5p的字词对应5p {1}},等等。上面的总和成为

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

给出每种面额的金额。