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 集合的划分【递归】相关推荐

  1. 信息学奥赛一本通 1315:【例4.5】集合的划分

    [题目链接] ybt 1315:[例4.5]集合的划分 [题目考点] 1. 递归/递推 2. 第二类斯特林数 [解题思路] 本题为求第二类斯特林数. 该问题可以描述为:将n个不相同的球放入k个相同的盒 ...

  2. 信息学奥赛一本通(1315:【例4.5】集合的划分)

    1315:[例4.5]集合的划分 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 11952     通过数: 5318 [题目描述] 设S是一个具有n个元素的集合 ...

  3. 算法设计思想(5)— 递归法

    1. 递归概念 递归 Recursion是指在函数的定义中使用函数自身的方法,直观上来看,就是某个函数自己调用自己. ​ 递归有两层含义: 递归问题必须可以分解为若干个规模较小.与原问题形式相同的子问 ...

  4. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法

    python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...

  5. 翻转二叉树 c语言实现 递归 栈 队列

    前言 题目比较好理解,就是翻转二叉树 代码 c语言实现 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  6. 快速排序的递归和非递归实现 c语言版本

    代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...

  7. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  8. 迭代是人,递归是神(迭代与递归的总结:比较)

    https://www.cnblogs.com/Renyi-Fan/p/7708012.html 在计算机编程实现中有常常两种方法:一曰迭代(iterate):二曰递归(recursion). 从&q ...

  9. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

最新文章

  1. Python之装饰器
  2. Android 曲线动画animation,类似加入购物车动画
  3. python高效开发实战
  4. Win10开始菜单中的天气不更新问题的解决方法
  5. Java开发利器--Lombok,IDEA端安装教程
  6. C#(.Net) 连接 ORACLE数据库
  7. 组策略应用之一:映射网络驱动器
  8. Logback MDC
  9. c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?
  10. 【情感分析】情感分析研究的新视野
  11. python分布式爬虫_python-分布式爬虫
  12. linux 锐捷 dns,锐捷Linux
  13. Python爬取必应图片
  14. 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
  15. image图片大小调整和方向调整(UIImageOrientation)
  16. python三维网格图_在三维Matplotlib图上调整网格线
  17. SSM毕设项目仓库管理系统lyf55(java+VUE+Mybatis+Maven+Mysql)
  18. 最新WebStrom 2018.3 破解教程永久激活
  19. Metal 框架之渲染到多个视口
  20. 如何让span中的文字垂直居中

热门文章

  1. 现成的CA证书签发工具
  2. GDAL插值使用示例
  3. 原生js更改html,原生js更改css样式的两种方式
  4. 修改linux端口22,修改LINUX 默认的22端口
  5. php mysql调用crontab_PHP中如何实现crontab代码
  6. 【java学习之路】(javaWeb篇)005.Js之DOM、对象、函数上下文
  7. java中的jni_JAVA中JNI的简单使用
  8. 永州计算机应用等级,5月永州计算机应用能力考试报名
  9. Navicat for MySQL 1130 - Host ‘DeskTop-**‘ is not allowed to connect to this MySQL-server错误解决
  10. CDH页面配置HA(高可用)