2021.01.20 强化模拟赛(3-2)

2.集合的划分
写这题的时候,我超想睡觉有精神。一开始找了半天规律,想用大法师写,但奈何我太清醒了,实在想不出来。然后搞了递推。

题目描述
设s是一个具有n个元素的集合,s={a1,a2,…,an},现将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的一个划分。它相当于把s集合中的n个元素a1,a2,…,an放入k个(0<k≤n<30)无标号的盒子中,使得没有一个盒子为空。
请你确定n个元素a1,a2,…,an放入k个无标号盒子中去的划分数s(n,k)。
输入一行 两个整数 n、k
输出一行,一个整数s(n,k)
样例输入
10 6
样例输出
22827

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int f[1005][1005] = {};
int main() {
	int n, k;
	scanf("%d %d", &n, &k);
	if(n < k)printf("0\n");
	f[0][0] = 1;
	for(int i = 1; i <= n; i ++) {
		for(int j = 1; j <= k; j ++) {
			f[i][j] = f[i - 1][j - 1] + f[i - 1][j] * j;
		}
	}
	printf("%d", f[n][k]);
	return 0;
}

这里的递推式意思是:f[n][k]表示n个数分成k份的可能性。f[n - 1][k - 1]表示当已经有n - 1个数在k - 1个盒子里时,剩下一个要放在第k个盒子里。f[n - 1][k]表示,当n - 1个数已经放满了k个盒子的时候,剩下一个就可以随便放,所以可能性就要乘k。然后它俩的加和即为总可能性。

好耶!!!
(又是询问坞主的一天。
什么时候才能自己解决更多的题呢
做完这道题之后发现还是需要多做题。因为递推递归我的思路都太烂啦,有时根本想不出来。
叹气。
最后在此感谢教我怎么改文字格式的学神。

学神永远滴神!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值