博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合划分问题
阅读量:6115 次
发布时间:2019-06-21

本文共 1143 字,大约阅读时间需要 3 分钟。

一.问题描述

  n个元素的集合{1,2,?, n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下:
{
{1},{2},{3},{4}},
{
{1,2},{3},{4}},
{
{1,3},{2},{4}},
{
{1,4},{2},{3}},
{
{2,3},{1},{4}},
{
{2,4},{1},{3}},
{
{3,4},{1},{2}},
{
{1,2},{3,4}},
{
{1,3},{2,4}},
{
{1,4},{2,3}},
{
{1,2,3},{4}},
{
{1,2,4},{3}},
{
{1,3,4},{2}},
{
{2,3,4},{1}},
{
{1,2,3,4}}
给定正整数n,计算出n个元素的集合{1,2,?, n }可以划分为多少个不同的非空子集。  

 

二.算法分析

  思路:对于n个元素的集合,可以划分成由m(1<=m<=n)个子集构成的子集,如 {

{1},{2},{3},{4}}就是由4个子集构成的非空子集。假设f(n,m)表示将n个元素的集合划分成由m个子集构成的集合的个数,那么可以这样来看:
     1)若m==1,则f(n,m)=1;
     2)若n==m,则f(n,m)=1;
     3)若非以上两种情况,f(n,m)可以由下面两种情况构成
        a.向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;
        b.向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。
因此:
             1     (m==1||n==m)
f(n,m)=
             f(n-1,m-1)+m*f(n-1,m)       (m<n&&m!=1)

1 #include
2 int f(int n,int m) 3 { 4 if(m==1||n==m) 5 return 1; 6 else 7 return f(n-1,m-1)+f(n-1,m)*m; 8 } 9 10 int main(void)11 {12 int n;13 while(scanf("%d",&n)==1&&n>=1)14 {15 int i;16 int sum=0;17 for(i=1;i<=n;i++)18 {19 sum+=f(n,i);20 }21 printf("%d\n",sum);22 }23 return 0;24 }

 

  

转载地址:http://cxvka.baihongyu.com/

你可能感兴趣的文章
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>
代码描述10313 - Pay the Price
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
vb sendmessage 详解1
查看>>
jquery用法大全
查看>>
Groonga 3.0.8 发布,全文搜索引擎
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>