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
共七种
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[n][n]<<endl;
}