題目描述
設s是乙個具有n個元素的集合,s=,現將s劃分成k個滿足下列條件的子集合s1,s2,…,sk,滿足:
(1)si≠ф
(2)si∩sj=ф (1≤i,j≤k i≠j)
(3)s1∪s2∪s3∪…∪sk=s
則s1,s2,…,sk是集合的乙個劃分。它相當於把s集合中的n個元素a1,a2,…,an放入k個(0 < k≤n < 30)無標號的盒子中,使得沒有乙個盒子為空。請你確定n個元素a1,a2,…,an放入k個無標號盒子中去的劃分數s(n,k)。
輸入輸入為一行:n k
輸出輸出為乙個整數
樣例輸入
4 3樣例輸出
6基本思路:
對於把n個元素放入k個集合
@1:如果a(n)是乙個獨立集合,那麼
s(n,k)=s(n-1,k-1)
也就是和n-1元素放入k-1集合的劃分數一樣
@2:如果a(n)是附加進入其他集合,那麼
s(n,k)=k*s(n-1,k)
在n-1元素放入k個集合的基礎上,a(n)有k種選擇,所以是k*s(n-1,k)
@3.最後注意一下當s(n,k)等於0或1的邊界條件就好了
**:
#includeusingnamespace
std;
intn,k;
int jihe(int n,int
k)
if(k==n||k==1
)
return jihe(n-1,k-1)+k*jihe(n-1
,k);
}int
main()
集合劃分(遞迴演算法)
問題描述 n個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 個不同的非空子集如下 給定正整數n,計算出n個元素的集合可以劃分為多少個不同的非空子集。其中設q n,m 表示n個數可以表示為m個非空子集。根據m和n的關係,可以分為以下情況 第一種情況 n 1時,只有乙個元素...
遞推遞迴 集合的劃分
設s是乙個具有n個元素的集合,s 現將s劃分成k個滿足下列條件的子集合s1,s2,sk,滿足 1 si 2 si sj 1 i,j k i j 3 s1 s2 s3 sk s 則s1,s2,sk是集合的乙個劃分。它相當於把s集合中的n個元素a1,a2,an放入k個 0 k n 30 無標號的盒子中,...
遞迴與遞推 集合的劃分
設s是乙個具有n個元素的集合,s 現將s劃分成k個滿足下列條件的子集合s1,s2,sk,且滿足 1 si 2 si sj 3 s1 s2 s3 sk s 則稱s1,s2,sk是集合s的乙個劃分。它相當於把s集合中的n個元素a1,a2,an放入k個 0 兩個整數n和k 乙個整數,劃分數s n,k 4 ...