集合的划分【转】
【文章參考來源:http://www.cnblogs.com/dolphin0520/archive/2011/07/12/2103917.html】
問題描述:n個(gè)元素的集合{1,2,……, n }可以劃分為若干個(gè)非空子集。例如,當(dāng)n=4 時(shí),集合{1,2,3,4}可以劃分為15 個(gè)不同的非空子集如下:
{{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}}
給定正整數(shù)n,計(jì)算出n個(gè)元素的集合{1,2,……, n }可以劃分為多少個(gè)不同的非空子集。??
思路:
根據(jù)數(shù)學(xué)知識(shí),n個(gè)元素的集合有2^n個(gè)子集,有2^n-1個(gè)非空子集。于是問題可以直接計(jì)算出答案。
?
下面是根據(jù)利用遞歸算法進(jìn)行計(jì)算的思路分析。
對于n個(gè)元素的集合,可以劃分成由m(1<=m<=n)個(gè)子集構(gòu)成的子集,如?{{1},{2},{3},{4}}就是由4個(gè)子集構(gòu)成的非空子集。
假設(shè)f(n,m)表示將n個(gè)元素的集合劃分成由m個(gè)子集構(gòu)成的集合的個(gè)數(shù),那么可以這樣來看:
? ? ?(0)若n<m或m==0,則f(n,m)=0;(為了不失一般性,這里依然討論m不在區(qū)間[1,n]的情況。)
? ? ?(1)若m==1,則f(n,m)=1;
? ? ?(2)若n==m,則f(n,m)=1;
? ? ?(3)若非以上兩種情況,f(n,m)可以由下面兩種情況構(gòu)成
??????? (a).向n-1個(gè)元素劃分成的m個(gè)集合里面添加一個(gè)新的元素,則有m*f(n-1,m)種方法;
??????? (b).向n-1個(gè)元素劃分成的m-1個(gè)集合里添加一個(gè)由一個(gè)元素形成的獨(dú)立的集合,則有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<stdio.h> 2 3 int f(int n,int m) 4 { 5 if(m==1||n==m) 6 return 1; 7 else 8 return f(n-1,m-1)+f(n-1,m)*m; 9 } 10 11 int main(void) 12 { 13 int n; 14 while(scanf("%d",&n)==1&&n>=1) 15 { 16 int i; 17 int sum=0; 18 for(i=1;i<=n;i++) 19 { 20 sum+=f(n,i); 21 } 22 printf("%d\n",sum); 23 } 24 return 0; 25 }?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/huashanqingzhu/p/3594577.html
總結(jié)
- 上一篇: C# GDI+编程(二)
- 下一篇: 硬链接、软链接和inode