首页 > 其他 > 详细

5719: 集合的划分(dfs)

时间:2019-08-15 13:34:24      阅读:116      评论:0      收藏:0      [点我收藏+]

5719: 集合的划分 技术分享图片

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 57            测试通过:37

描述

 

 

设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)。

 

 

技术分享图片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 typedef long long ll;
 8 int n,k;
 9 
10 ll dfs(int n,int k){
11     if(n==k||k==1) return 1;
12     if(n<k) return 0;
13     return dfs(n-1,k-1)+k*dfs(n-1,k);
14 }
15 
16 int main(){
17     ios::sync_with_stdio(false);
18     cin>>n>>k;
19     cout << dfs(n,k) << endl;
20     return 0;
21 }
View Code

 

样例输入

样例输出

提示

结果保证在64位整型之内

解题思路: dfs 划分为小问题来考虑  找到递归结束的条件 递推的公式     1个球要么单独放要么和他们放在一起 

 

5719: 集合的划分(dfs)

原文:https://www.cnblogs.com/qq-1585047819/p/11357361.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!