集合划分问题(转载)

集合划分问题

问题描述:
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)

#include<stdio.h>

int f(int n,int m)
{
    if(m==1||n==m)
        return 1;
    else
        return f(n-1,m-1)+f(n-1,m)*m;
}

int main(void)
{
    int n;
    while(scanf("%d",&n)==1&&n>=1)
    {
        int i;
        int sum=0;
        for(i=1;i<=n;i++)
        {
            sum+=f(n,i);
        }
        printf("%d\n",sum);
    }
    return 0;
}

http://www.cnblogs.com/dolphin0520/archive/2011/07/12/2103917.html

时间: 2024-08-29 17:08:44

集合划分问题(转载)的相关文章

[ACM] FZU 1570 集合划分问题( 不同小球放入相同盒子,第二类Stirling数)

Problem Description 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,

10个经典的Java面试题集合(转载)

1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象.当我们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象.当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象.HashMap 使用 Linked

集合划分问题算法探讨

原题: n个元素的集合{1,2,3,..., 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}}

android progress 集合(转载)

转载地址:http://blog.csdn.net/playboyanta123/article/details/7934789 普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中. 一般只要在XML布局中定义就可以了. <progressBar android:id="@+id/widget43" android:layout_width="wrap_content" android:la

Xcode因为证书报错集合(转载)

证书问题 Xcode 经常报这样或那样的错,经过长时间的实践,现在看见 Xcode 报错已经心平气和了,经常报的错就那么多,整理一下. 1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中心重新生成一个. 3. 包标识符不与描述文件包含的包标识符不一致,按照它的提示换一下就好了,最好不要点 Fix Issue,点完后 Xcode 会自己生成一个包含统配包标识符的描述文件,并且 Remove 已经生成好的描述文件.会影响整个团队的合作. 4.proces

Oracle判断语句集合(转载)

SELECT decode(sign(to_date('2008-05-01', 'yyyy-MM-dd') -                   to_date('2008-03-01', 'yyyy-MM-dd')),              1,              to_date('2008-05-02', 'yyyy-MM-dd'),              to_date('2008-03-02', 'yyyy-MM-dd'))  FROM dual --decode只支

[转载][资料].计算机视觉、机器学习相关领域论文和源代码大集合

注:下面有project网站的大部分都有paper和相应的code.Code一般是C/C++或者Matlab代码. 最近一次更新:2013-3-17 目录(注:未添加索引,仅用于方便浏览) 一.特征提取Feature Extraction 二.图像分割Image Segmentation 三.目标检测Object Detection 四.显著性检测Saliency Detection 五.图像分类.聚类Image Classification, Clustering 六.抠图Image Matt

[转]容斥原理与多重集合{理论}

本文转自http://blog.csdn.net/ACdreamers/article/details/9923955 原博主:ACdreamers 首先介绍一个重要定理: 设S是有k种类型对象的多重集合,每种元素均具有无限的重复数.那么S的r组合的个数等于: 问题一:多重集合的组合问题 问题描述:给定3个a,4个b,5个c,现在要选10个元素,求一共有多少种组合? 分析:本问题就是相当于求S={3·a,4·b,5·c}的10组合数. 首先,多重集合的组合有一个定理,定理描述如下: 设S是有k种

ACM 算法实现

实验一 统计数字问题 1.问题描述:一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如,第6 页用数字6 表示,而不是06 或006 等.数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9.2.题目分析:考虑由0,1,2,…,9组成的所有n位数.从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为. 满足如下递归式:由此可知,.据此,可从低位向高位进行