您的位置:首页 > 编程语言 > Go语言

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)代表没有空盘子

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: