Algorithm Gossip: 数字拆解
2014-05-06 21:17
423 查看
3 = 2+1 = 1+1+1 所以3有三种拆法
4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种
5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1
共七种
依此类推,请问一个指定数字NUM的拆解方法个数有多少个?
模拟肯定是不行滴
这种题目其实直接联想到的就是dp
它和这道题目是等价的:
n个苹果放到n个盘子中, 1 1 2和1 2 1是相同的方法只能算一种,是一个类型
即2维的dp
例如:
4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种
4相当于只用1个盘子,即4 0 0 0
3+1相当于用2个盘子,即3 1 0 0
2+2相当于用2个盘子,即2 2 0 0
2+1+1相当于用3个盘子,即2 1 1 0
1+1+1+1相当于用4个盘子,即1 1 1 1
dp方程为:
f(n,k) = f(n,k-1)+f(n-k,k)
f(n,k-1)代表有空盘子
f(n-k,k)代表没有空盘子
4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种
5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1
共七种
依此类推,请问一个指定数字NUM的拆解方法个数有多少个?
模拟肯定是不行滴
这种题目其实直接联想到的就是dp
它和这道题目是等价的:
n个苹果放到n个盘子中, 1 1 2和1 2 1是相同的方法只能算一种,是一个类型
即2维的dp
例如:
4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种
4相当于只用1个盘子,即4 0 0 0
3+1相当于用2个盘子,即3 1 0 0
2+2相当于用2个盘子,即2 2 0 0
2+1+1相当于用3个盘子,即2 1 1 0
1+1+1+1相当于用4个盘子,即1 1 1 1
dp方程为:
f(n,k) = f(n,k-1)+f(n-k,k)
f(n,k-1)代表有空盘子
f(n-k,k)代表没有空盘子
void dp(int n){ for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) f[i][j] = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==1 || j==1){ f[i][j] = 1; continue; } if(i<j) f[i][j] = f[i][i]; else if(i==j) f[i][j] = f[i][j-1]+1; else f[i][j] = f[i][j-1]+f[i-j][j]; } } cout<<f <<endl; }
相关文章推荐
- Algorithm-Gossip(2) 费布拉切数列
- Algorithm Gossip: 筛选求质数
- Algorithm Gossip: m元素集合的n个元素子集
- 数字拆解
- Algorithm-Gossip(3) 巴斯卡三角形
- AlgorithmGossip (19) 完美数
- Algorithm Gossip (22) 中序式转后序式(前序式)
- 数字拆解算法分析及实现(C/OC)
- Algorithm Gossip: 老鼠走迷官(一)
- Algorithm-Gossip(4) 三色棋(Three_Color_Flag)
- Algorithm Gossip (24) 洗扑克牌(乱数排列)
- Objective-C实现Algorithm Gossip: 费式数列代码
- C#算法大全-2-Algorithm Gossip: 费式数列
- 将任一个数字进行拆解
- Algorithm Gossip(5) 老鼠找迷宫(1)
- vc++网络安全编程范例(19)实现数字信封打包与拆解
- Algorithm Gossip:生命游戏
- Algorithm Gossip(6) 老鼠找迷宫(2)