您的位置:首页 > 其它

母函数——经典砝码、邮票问题和邮票附加题的最简实战应用教程+最简原理分析

2017-12-01 01:20 375 查看
砝码问题

1个1克的砝码

1个2克的砝码

1个3克的砝码

1个4克的砝码

问可以组合出几种不同的重量

1个1克的砝码 表示为 1+ x^1 

1个2克的砝码 表示为 1+ x^2

1个3克的砝码 表示为 1+ x^3

1个4克的砝码 表示为 1+ x^4

为什么要这样表示呢?

因为我们后面是这样做的(1+ x^1 )*(1+ x^2 )*(1+ x^3 )*(1+ x^4 )

我们分析下1g的砝码,他有两种情况,一种是你选了他,你种是你不选他。那你不选他,自然就是(1+ x^1 )左边的1带进去乘,对整个结果自然不会有影响

而如果你选了他,那么自然就是x^1带进去乘了,那么这个x^1无疑就代表了1g的砝码被选择的情况。

为什么这个x^1可以代表1g的砝码被选择的情况呢?

因为假如后面你和x^2,x^3这些代表2g3g被选取的情况相乘,(这里假设123g是被选取的,4没有被选)那么乘出来就是x^(1+2+3)=x^5,所以这就代表了一种质量总和为5的情况。

所以我们把1+ x^1 拆分开来,就是考虑了1g砝码加和不加的两种情况。再把所有加和不加的情况相乘,那就是得出了所有的情况。系数代表的就是和,即可能的加出来的重量。

我们看一下乘积:

=1*x^0+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10

那么0g的情况有1种,1g的情况有1种,。。。5g的情况有两种(5=1+4=2+3)。。。

邮票问题

1分,2分,3分这3种邮票贴出不同总和的情况(假设1,2,3分都有无数个)

举个例子来理解这个题目:

4可以分为

4

=2+2

=1+3

=1+1+2

=1+1+1+1

那么用上面的思维(这里假设你要求和为4有几种情况,那么x的4次就是极限了,多了也没用)

1分 1 + x^1 + x ^ (1*2)+x ^ (1*3)+ x^(1*4)         (+ x^(1*5))

2分 1 + x^2 + x ^ (2*2)                                                 (+ x ^ (2*3)到达了6,被过滤)

3分 1 + x^3                                                                       (+ x ^ (3*2)这个被过滤了,因为到达了6)

乘积=(1+x+x^2+x^3+x^4) * (1 + x^2 + x ^ 4) * (1+x^3)=



简略了合并整理的过程,数出来发现是4个,正确。

那么问题来了。这个用题用代码怎么去实现?

假设你要求的是和为n有几种情况?

这里简单给一个思路:

1.保证每一个乘数

例如1 + x^1 + x ^ (1*2)+x ^ (1*3)+ x^(1*4)+。。。

最后一个的次方数不能超过n

2.我们怎么表示这个式子?

用一个数组,其每一位存储的值是这样的:

0 1 2 3 4 5 6 7...这是邮票1的情况

0 2 4 6 8....这是邮票2的情况

0 3 6 9 12 15...这是邮票3的情况

3.那么就变成了3个数组排列组合的问题。开3个for循环即可,遍历3个数组中的每个值,相加,当和为4的情况出现,flag++。

附加题

这里我们还是讨论邮票,但是不仅限于1,2,3这3个面额的邮票。4,5,6任意的面额都可以。

那么问题来了:和为n的情况有几种?

上面的东西全部理解的同学可以轻松搞定这个附加题。

先举个例子把题意完全讲明白:

假如你要求的是5。那么1,2,3,4,5这5种面值你都可以使用。

代码思路:

传进来的是n,开n个数组即可。就好比这个和为5的这个例子

数组1:0 1 2 3 4 5

数组2:0 2 4

数组3:0 3

数组4:0 4

数组5:0 5

就解决了。题外话,难道n个数组就傻傻地开n个for循环吗,最后我看了一下。开3重循环,从最后一层开始找就很快了。这样一来时间复杂度远没有O(n^3)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: