集合的劃分 遞迴

2022-07-03 15:48:15 字數 854 閱讀 3245

題目描述

設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的邊界條件就好了

**:

#includeusing

namespace

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 ...