集合的划分(2)

简介: /*=======================================================================3253:集合的划分总时间限制: 1000ms 内存限制: 65536kB描述把一个集A(本题中的集合均不含重复元素)分成若干个非空子集,使得A中每个元素属于且仅属于一个子集,那么这些子集构成的集合称为A的一个划分。
/*=======================================================================
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)+2*F(3,2)=1+2*3=7

来源:http://bailian.openjudge.cn/practice/3253/ 
=========================================================================*/
 1 #include <stdio.h>
 2 long long fun(int n,int m)
 3 {
 4     if(n<m) return 0;
 5     else if(n==0||n==m||n==1||m==1) return 1;
 6     else return fun(n-1,m-1)+m*fun(n-1,m);
 7 }
 8 int main(int argc, char *argv[])
 9 {
10     int n,i;
11     long long ans;
12     while(scanf("%d",&n)!=EOF)
13     {
14         ans=0;
15         if(n==0) ans=1;
16         for(i=1;i<=n;i++)
17         {
18             ans=ans+fun(n,i);
19         }
20         printf("%lld\n",ans);
21     }
22     return 0;
23 }

题目链接:http://bailian.openjudge.cn/practice/3253/

 

相关文章
|
JavaScript 前端开发 Python
【python自动化】Playwright基础教程(三)定位操作
【python自动化】Playwright基础教程(三)定位操作
369 0
|
域名解析 弹性计算 固态存储
阿里云服务器续费为什么贵?我们应该怎么办?
很多用户在首次购买阿里云服务器的时候都都是通过阿里云各种活动买的一年,到第二年续费的时候才发现,第一年买才一两百元的云服务器,续费就要1000多了,这时候就犯难了,续费吧,觉得续费太贵了,不续费吧,云服务器又还要使用,所以我们应当在购买和续费阿里云服务器的时候注意以下几点,能一定程度上避免阿里云续费续费太贵的情况。
阿里云服务器续费为什么贵?我们应该怎么办?
|
7月前
|
内存技术
Synaptics旗下主流WIFI方案选型参考
WIFI行业经过最近十来年的飞速发展,已经显得含金量不高,遍地都是,但是稳定性是检验WIFI品质的唯一标准,潮起潮落,时间会告诉你最终谁是最可靠! WIFI方案方案选型最主要考虑以下三点:WIFI/BT通信标准、通信接口、吞吐量!接下来析下Synaptics旗下对应的方案! 从WIFI/BT通信标准来看: Wi-Fi 6E有:SYN43756E、SYN43711、SYN4382S、SYN4383; Wi-Fi 6有:SYN43752; Wi-Fi 5有:SYN43598、SYN43456; Wi-Fi 4有:SYN43436、SYN43012、BCM430132;
|
人工智能 数据中心 芯片
液冷是大模型对算力需求的必然选择?|英伟达 GTC 2024六大亮点
在这个以高性能计算和大模型推动未来通用人工智能时代,算力已成为科技发展的隐形支柱。本文将重点探讨算力的演进,深入分析在不同领域中算力如何成为推动进步的基石;着眼于液冷如何突破算力瓶颈成为引领未来的先锋,对液冷散热的三种方式(冷板式、浸没式和喷淋式)做了详细的对比分析、成本测算和市场空间预测。并为您提供一份“实用教程”,指导如何将普通服务器改装为液冷服务器,以应对越来越复杂的计算需求。
|
10月前
|
数据可视化 项目管理
解锁教培团队协作新方式!在线协作软件必备指南
随着教育培训行业的快速发展,教培团队面临沟通断层、任务混乱和资源分配难等管理难题。在线协作工具应运而生,通过任务集中化管理、高效沟通与协作、资源合理分配和数据驱动决策,帮助团队实现数字化转型,提升管理效率。推荐几款适合教培团队的工具:板栗看板、Trello、Asana、Monday.com 和 Notion,每款工具都有其独特优势,可根据团队需求选择最合适的解决方案。
221 12
|
10月前
|
数据采集 安全 文件存储
NAS极速远程访问!贝锐花生壳推出飞牛fnOS专属内网穿透服务
贝锐花生壳与飞牛私有云fnOS合作,推出专属客户端及映射服务,实现3倍传输速率提升。用户只需在fnOS应用中心搜索“花生壳”,一键安装即可享受高速、稳定、安全的远程NAS访问体验。
1112 9
|
Java
SpringBoot项目使用Pulsar遇到的问题
SpringBoot项目使用Pulsar遇到的问题
133 4
|
12月前
|
传感器 监控 算法
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
556 6
|
区块链 Python
最新用Python从零开始创建区块链_基于python做区块链,哔哩哔哩测试面试题
最新用Python从零开始创建区块链_基于python做区块链,哔哩哔哩测试面试题
|
边缘计算 运维 安全
服务化架构 (SBA) 在 5G 核心网中的关键作用
服务化架构 (SBA) 在 5G 核心网中的关键作用
777 1