信息学奥赛一本通–1315:【例4.5】集合的划分
算法 :递归
思路:
要求s(n,m):有n个元素划分成m个集合,有多少种划分方法,即对于一个元素a,有2种选择,
- a单独一个盒子,其他n-1元素放倒k-1个盒子中,即s(n-1,n-1)
- a与其他元素放在一个盒子中,首先把n-1个盒子放到k个中:s(n-1,k),
在把a放到k个盒子中的任意一个盒子中(即有k种情况):k*s(n-1).
#include <iostream>
using namespace std;
typedef long long LL;
LL dfs(int n,int k)
{
if(n < k || k == 0) return 0;
if(n == k || k == 1) return 1;
return dfs(n-1,k-1) + k*dfs(n-1,k);
}
int main()
{
int n,m;
cin>>n>>m;
cout<<dfs(n,m);
return 0;
}