母函数——经典砝码、邮票问题和邮票附加题的最简实战应用教程+最简原理分析
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)。
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)。
相关文章推荐
- react native 实战系列教程之热更新原理分析与实现
- Android实战教程第六篇之一键锁屏应用问题解决
- [置顶] 【稀饭】react native 实战系列教程之热更新原理分析与实现
- 表格行与列边框样式处理的原理分析及实战应用
- Java实战应用视频教程之Java算法分析与设计
- GBDT 入门教程之原理、所解决的问题、应用场景讲解
- 实战应用Java算法分析与设计视频教程
- Spring Security4实战与原理分析视频教程
- Java实战应用视频教程之Java算法分析与设计
- 红外摄像机应用原理与常见技术问题分析
- 【稀饭】react native 实战系列教程之热更新原理分析与实现
- 声控开关电路原理图-门电路、限流电阻应用经典分析
- react native 实战系列教程之热更新原理分析与实现
- 表格行与列边框样式处理的原理分析及实战应用
- Spring Boot实战与原理分析视频教程
- Struts模块化编程经典实战教程(一)
- 经典数据结构之栈的应用-迷宫问题
- DirectShow组件原理分析及应用
- 网络附加存储设备NAS等设备应用在数据备份(本地及远程数据备份)、数据容灾应用中的分析
- [教程] 谈谈网页设计中的字体应用 (3) 实战应用篇·上