问题描述:
n个元素的集合{1,2,?, n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下:
{{1},{2},{3},{4}}, {{1,2},{3,4}},
{{1,2},{3},{4}}, {{1,3},{2,4}},
{{1,3},{2},{4}}, {{1,4},{2,3}},
{{1,4},{2},{3}}, {{1,2,3},{4}},
{{2,3},{1},{4}}, {{1,2,4},{3}},
{{2,4},{1},{3}}, {{1,3,4},{2}},
{{3,4},{1},{2}}, {{2,3,4},{1}},
{{1,2,3,4}}
给定正整数n,计算出n个元素的集合{1,2,?, n }可以划分为多少个不同的非空子集。
分析
思路:
设F(n,m)表示为n个元素划分为m个非空子集的不同集合的个数
if: m == 1 || n == m return 1;
else: F(n,m) = m*F(n-1,m)+F(n-1,m-1); 表示m*F(n-1,m)表示n-1个元素划分为m个子集并在任意一个子集中添加第n个元素
F(n-1,m-1)表示n-1个元素划分为m-1个子集
代码
#include<stdio.h>
int F(int n,int m){
if(m == 1 || n == m)
return 1;
return m*F(n-1,m) + F(n-1,m-1);
}
int main(){
int n;
scanf("%d",&n);
int i,sum = 0;
for(i = 1; i <= n; i++)
sum += F(n,i);
printf("%d",sum);
return 0;
}