南沙C++信奥老师解一本通题: 1315:【例4.5】集合的划分

 

【题目描述】

【输入】

给出n和k。

【输出】

n个元素a1,a2,……,an放入k个无标号盒子中去的划分数S(n,k)。

【输入样例】

10 6

 

【输出样例】

22827

 

#include <iostream>
using namespace std;
long long Split(int n,int plate)  //等同于n个不同的数 放到相同的盘子里了 
{
	//这步不能跟后面的交换,因为n==plate==0这情况应返回是0,而不是1 
	if(n<plate||plate==0) //例9个数放到 10个盘子,这种情况不能使每个盘子有数字,则为0 
		return 0;   
	if(n==plate||n==1)   //一个数 只能有一种放法,如果n个数,n个盘子也只能有一个放法
		return 1;
	 // 一个数 放一个盘子+ 这个数,先不放,让别的先放好放好共有 Split(n-1,plate)种,然后等他们放好后,再放其中一个盘子,
	 //显然是分步原理,根据概论率分步原理得  plate* Split(n-1,plate)
	return Split(n-1,plate-1)+Split(n-1,plate)*plate;
}
int main()
{
	int n,k;
	cin>>n>>k;
	cout<<Split(n,k);
	return 0;
}

 

posted @ 2024-09-11 18:06  信奥赛老师  阅读(86)  评论(0)    收藏  举报