(递归)集合划分

链接

对递归题目的求解就是要在最一般情况下进行考虑,也就是说,要考虑这道题

的本质,然后使用递归求解。

对于本道题,是将 n 个元素放到 k 个盒子里且盒子不能为空,那么就有两种情况,

第一种,先将任意一个元素放到盒子里,那么剩下 n - 1 个球和 k - 1 个盒子,对

应下面的代码就是cal( n - 1, k - 1)。

第二种,某一个元素不放到盒子里,那么就是先将剩下的 n - 1 个元素放到 k 个

盒子里,再将这一个元素放到 K 个盒子里的任意一个,那么对应下面的代码就是

k * cal( n - 1, k).

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 int cal(int n, int k){
 5     if(n < k || k == 0) return 0;
 6     if(n == k || k == 1) return 1;
 7     return cal(n - 1, k - 1) + k * cal(n - 1, k);
 8 }
 9 int main(){
10     int n, k;
11     cin >> n >> k;
12     cout << cal(n, k) << endl;
13 
14     system("pause");
15     return 0;
16 }

 

原文地址:https://www.cnblogs.com/pureayu/p/13655039.html