解题思路:
利用递归(注意一定要有递归出口 特殊情况!!①元素个数少于集合个数 没有集合 都返回0 ②集合只有一个 或者 元素个数等于集合个数 都返回1)
递归式子思路:总情况数就只有两个情况 :①最后一个数单独一个集合 n-1个元素分成了k-1个集合 他们分法就S(n-1,k-1)的分法数;②第二种情况是n-1个元素已经分成k个集合 最后一个元素加入任意其中一个就好了(那么就有k种情况) 则该情况的分法数为k*S(n-1,k)。则总分法就是把两个情况相加
注意事项:
注意定义long long数据类型
参考代码:
#include<stdio.h>
//n为元素个数 k为集合个数
long long S(int n, int k){
//特殊情况 元素个数少于集合个数 没有集合 都返回0
if(n<k || k==0 || n==0){
return 0;
}
//特殊情况 集合只有一个 或者 元素个数等于集合个数
if(k==1 || n==k){
return 1;
}
//总情况数就只有两个情况
//最后一个数单独一个集合 n-1个元素分成了k-1个集合 他们分法就S(n-1,k-1)的分法数
//第二种情况是n-1个元素已经分成k个集合 最后一个元素加入任意其中一个就好了(那么就有k种情况) 则该情况的分法数为k*S(n-1,k)
//则总分法就是把两个情况相加
return S(n-1,k-1)+k*S(n-1,k);
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
long long num = S(n,k);
printf("%lld",num);
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复