1. 程式人生 > 實用技巧 >【TFLSnoi李志帥】---函式遞迴

【TFLSnoi李志帥】---函式遞迴

fyx的部落格地址,牆裂推薦!部落格:https://www.cnblogs.com/qwn34/

1315:【例4.5】集合的劃分

老獅:這也是一道經典例題,做好這道題,你的遞迴差不多就沒問題了【狗頭保命】


時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 9463 通過數: 4074

【題目描述】

設S是一個具有n個元素的集合,Sa1a2an現將S劃分成k個滿足下列條件的子集合S1S2…Sk,且滿足:

1.Si

2.SiSj (

1ijki≠j)

3.S1S2S3SkS

則稱S1S2Sk是集合S的一個劃分。它相當於把S集合中的n個元素a1a2an放入k個(0kn30)無標號的盒子中,使得沒有一個盒子為空。請你確定n個元素a1a2an放入k個無標號盒子中去的劃分數S(n,k)

【輸入】

給出nk。

【輸出】

n個元素a1a2an放入k個無標號盒子中去的劃分數S(n,k)

【輸入樣例】

10 6

【輸出樣例】

22827


————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
這道題有很多亂七八糟的符號,看起來有點怪怪的
翻譯過來就是。。。

1.Si0 沒有空盤子

2.Si-Sj!0 也就是說每個盤子裡元素數量各不相同 (1ijki≠j)

3.S1+S2+S3++SkS 每個元素都要分進盤子

上程式碼!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,k;
 4 long long jh(int n,int k)
 5 {
 6     if(n<k || k==0)return 0;//遞迴邊界,當盒子數比元素數大時,歸零;當沒有盒子時,歸零;
 7     else if(k==n || k==1)return 1;//遞迴邊界,當盒子數等於元素數時,歸一;當只有一個盒子時,歸一;
 8     return jh(n-1,k)*k+jh(n-1,k-1);//遞迴式
 9 }
10 int main()
11 {
12     cin>>n>>k;
13     cout<<jh(n,k);
14     return 0;
15 }

最後————

fyx的部落格地址,牆裂推薦!部落格:https://www.cnblogs.com/qwn34/