Bailian3253 集合的划分【递归】
3253:集合的划分
总时间限制: 1000ms 内存限制: 65536kB
描述
把一个集A(本题中的集合均不含重复元素)分成若干个非空子集,使得A中每个元素属于且仅属于一个子集,那么这些子集构成的集合称为A的一个划分。比如A={1,2,3},那么{ {1},{2 ,3} }以及{ {1},{2},{3} } 都是A的划分。现在给定一个整数n,我们希望知道包含n个元素的集合有多少不同的划分。当n=3的时候,仍然考虑集合{1,2,3},它的所有划分如下
{ {1} , {2} , {3} }
{ {1 , 2} , {3} }
{ {1 , 3} , {2} }
{ {1} , {2 , 3} }
{ {1 , 2 , 3} }
只有5种,但随n的增加,划分方法的个数会以指数速度增加。比如n=4的时候,就有15种方法,考虑集合{1,2,3,4},划分方式如下
{ {1},{2},{3},{4}}
{{1},{2},{3,4}}
{{1,2},{3},{4}}
{{1,3},{2},{4}}
{{1,4},{2},{3}}
{{1},{2,3},{4}}
{{1},{3},{2,4}}
{{1,2},{3,4}}
{{1,3},{2,4}}
{{1,4},{2,3}}
{{1},{2,3,4}}
{{2},{1,3,4}}
{{3},{1,2,4}}
{{4},{1,2,3}}
{{1,2,3,4}}
当n>15的时候,划分方法数将超过32位整数所能表示的范围,我们希望你的程序能计算出n<=15的时候,包含n个元素的集合的划分方法的个数
输入
一个整数n(0<=n<=15,n=0的时候认为有一种划分方法)
输出
包含n个不同元素的集合的划分方法的个数
样例输入
3
15
样例输出
5
1382958545
提示
递归公式,
设n个元素的集合可以划分为F(n,m)个不同的由m个非空子集组成的集合。
F(n,m) = 1, where n=0, n=m, n=1, or m=1
F(n,m) = 0, where n<m
否则
F(n,m)=F(n-1,m-1)+m*F(n-1,m)
例如:
考虑3个元素的集合,可划分为
① 1个子集的集合:{{1,2,3}}
② 2个子集的集合:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}}
③ 3个子集的集合:{{1},{2},{3}}
∴F(3,1)=1;F(3,2)=3;F(3,3)=1;
如果要求F(4,2)该怎么办呢?
A.往①里添一个元素{4},得到{{1,2,3},{4}}
B.往②里的任意一个子集添一个4,得到
{{1,2,4},{3}},{{1,2},{3,4}},
{{1,3,4},{2}},{{1,3},{2,4}},
{{2,3,4},{1}},{{2,3},{1,4}}
∴F(4,2)=F(3,1)+2F(3,2)=1+23=7
来源
cs10107 C++ Final Exam
问题链接:Bailian3253 集合的划分
问题简述:(略)
问题分析:递归组合问题,用递归函数来解决。如果需要加速,可以使用记忆化递归来实现。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* Bailian3253 集合的划分 */#include <stdio.h>long long fun(int n,int m)
{if (n < m) return 0;else if (n == 0 || n == m || n == 1 || m == 1) return 1;else return fun(n - 1, m - 1) + m * fun(n - 1, m);
}int main()
{int n;while (scanf("%d", &n)!=EOF) {long long ans = 0;if (n == 0)ans = 1;elsefor (int i = 1; i <= n; i++)ans += fun(n, i);printf("%lld\n",ans);}return 0;
}
Bailian3253 集合的划分【递归】相关推荐
- 信息学奥赛一本通 1315:【例4.5】集合的划分
[题目链接] ybt 1315:[例4.5]集合的划分 [题目考点] 1. 递归/递推 2. 第二类斯特林数 [解题思路] 本题为求第二类斯特林数. 该问题可以描述为:将n个不相同的球放入k个相同的盒 ...
- 信息学奥赛一本通(1315:【例4.5】集合的划分)
1315:[例4.5]集合的划分 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11952 通过数: 5318 [题目描述] 设S是一个具有n个元素的集合 ...
- 算法设计思想(5)— 递归法
1. 递归概念 递归 Recursion是指在函数的定义中使用函数自身的方法,直观上来看,就是某个函数自己调用自己. 递归有两层含义: 递归问题必须可以分解为若干个规模较小.与原问题形式相同的子问 ...
- 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法
python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...
- 翻转二叉树 c语言实现 递归 栈 队列
前言 题目比较好理解,就是翻转二叉树 代码 c语言实现 #include<stdio.h> #include<stdlib.h> #include<string.h> ...
- 快速排序的递归和非递归实现 c语言版本
代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...
- LeetCode 10. Regular Expression Matching python特性、动态规划、递归
前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...
- 迭代是人,递归是神(迭代与递归的总结:比较)
https://www.cnblogs.com/Renyi-Fan/p/7708012.html 在计算机编程实现中有常常两种方法:一曰迭代(iterate):二曰递归(recursion). 从&q ...
- java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)
前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...
最新文章
- Python之装饰器
- Android 曲线动画animation,类似加入购物车动画
- python高效开发实战
- Win10开始菜单中的天气不更新问题的解决方法
- Java开发利器--Lombok,IDEA端安装教程
- C#(.Net) 连接 ORACLE数据库
- 组策略应用之一:映射网络驱动器
- Logback MDC
- c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?
- 【情感分析】情感分析研究的新视野
- python分布式爬虫_python-分布式爬虫
- linux 锐捷 dns,锐捷Linux
- Python爬取必应图片
- 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
- image图片大小调整和方向调整(UIImageOrientation)
- python三维网格图_在三维Matplotlib图上调整网格线
- SSM毕设项目仓库管理系统lyf55(java+VUE+Mybatis+Maven+Mysql)
- 最新WebStrom 2018.3 破解教程永久激活
- Metal 框架之渲染到多个视口
- 如何让span中的文字垂直居中
热门文章
- 现成的CA证书签发工具
- GDAL插值使用示例
- 原生js更改html,原生js更改css样式的两种方式
- 修改linux端口22,修改LINUX 默认的22端口
- php mysql调用crontab_PHP中如何实现crontab代码
- 【java学习之路】(javaWeb篇)005.Js之DOM、对象、函数上下文
- java中的jni_JAVA中JNI的简单使用
- 永州计算机应用等级,5月永州计算机应用能力考试报名
- Navicat for MySQL 1130 - Host ‘DeskTop-**‘ is not allowed to connect to this MySQL-server错误解决
- CDH页面配置HA(高可用)