数的划分
题目链接:数的划分
题目描述
解题思路
设
f
i
,
j
f_{{i},{j}}
fi,j 表示将
i
i
i 分成
j
j
j 份的情况数。
显然,当
i
=
j
i=j
i=j 时
f
(
i
)
(
j
)
f(i)(j)
f(i)(j) 是只有一种情况的,也就是为
1
1
1 。
如果
j
>
i
j>i
j>i ,连
1
1
1 一份都不够,那么肯定是不合法的,为
0
0
0。
考虑正常情况:
- 如果我们在原序列的情况下在后面加一个 1 1 1 ,那么原总数则为 i − 1 i-1 i−1 ,原份数为 j − 1 j-1 j−1。
- 如果我们在原序列的基础上每个数加 1 1 1 ,那么原总数为 i − j i-j i−j ,原份数为 j j j。
那么递推式为:
f
i
,
j
=
f
i
−
1
,
j
−
1
+
f
i
−
j
,
j
f_{{i},{j}}=f_{{i-1},{j-1}}+f_{{i-j},{j}}
fi,j=fi−1,j−1+fi−j,j
code
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int f[210][10];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(i==j)
f[i][j]=1;
else if(j>i)
f[i][j]=0;
else
f[i][j]=f[i-1][j-1]+f[i-j][j];
}
cout<<f[n][m];
}