【TFLSnoi李志帅】---函数递归
fyx的博客地址,墙裂推荐!博客:https://www.cnblogs.com/qwn34/
1315:【例4.5】集合的划分
老狮:这也是一道经典例题,做好这道题,你的递归差不多就没问题了【狗头保命】
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 9463 通过数: 4074
【题目描述】
设S是一个具有n个元素的集合,S=⟨a1,a2,……,an⟩现将S划分成k个满足下列条件的子集合S1,S2,……Sk,且满足:
1.Si≠∅
2.Si∩Sj=∅ (1≤i,j≤k,i≠j)
3.S1∪S2∪S3∪…∪Sk=S
则称S1,S2,……,Sk是集合S的一个划分。它相当于把S集合中的n个元素a1,a2,……,an 放入k个(0<k≤n<30)无标号的盒子中,使得没有一个盒子为空。请你确定n个元素a1,a2,……,an 放入k个无标号盒子中去的划分数S(n,k)。
【输入】
给出n和k。
【输出】
n个元素a1,a2,……,an 放入k个无标号盒子中去的划分数S(n,k)。
【输入样例】
10 6
【输出样例】
22827
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
这道题有很多乱七八糟的符号,看起来有点怪怪的
翻译过来就是。。。
1.Si≠0 没有空盘子
2.Si-Sj!=0 也就是说每个盘子里元素数量各不相同 (1≤i,j≤k,i≠j)
3.S1+S2+S3+…+Sk=S 每个元素都要分进盘子
上代码!
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,k; 4 long long jh(int n,int k) 5 { 6 if(n<k || k==0)return 0;//递归边界,当盒子数比元素数大时,归零;当没有盒子时,归零; 7 else if(k==n || k==1)return 1;//递归边界,当盒子数等于元素数时,归一;当只有一个盒子时,归一; 8 return jh(n-1,k)*k+jh(n-1,k-1);//递归式 9 } 10 int main() 11 { 12 cin>>n>>k; 13 cout<<jh(n,k); 14 return 0; 15 }
最后————
fyx的博客地址,墙裂推荐!博客:https://www.cnblogs.com/qwn34/