集合划分问题(1)

集合划分问题(1)

时间: 1ms        内存:64M

描述:

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 }可以划分为多少个不同的非空子集。

输入:

输入数据只有1行是元素个数n(n≤20)。

输出:

输出一个整数,表示计算出的不同的非空子集数。

示例输入:

5

示例输出:

52

提示:

参考答案(内存最优[748]):

#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; 
} 

参考答案(时间最优[0]):

#include<iostream>
using namespace std;
int S(int m,int n);
int main()
{
    int n,i,sum=0;
    cin>>n;
    if(n<1)
        cout<<"1"<<endl;
    else
    {
        for(i=1; i<=n; i++)
        {
            sum+=S(i,n);
        }
        cout<<sum<<endl;
    }
}
int S(int m,int n)
{
    if(m==1)   return 1;
    if(m==n)   return 1;
    else      return S(m-1,n-1)+S(m,n-1)*m;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注