博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合的划分(递推)
阅读量:5113 次
发布时间:2019-06-13

本文共 1033 字,大约阅读时间需要 3 分钟。

集合的划分

时间限制: 1 Sec  内存限制: 128 MB
提交: 9  解决: 8
[][][][命题人:]

题目描述

设S是一个具有n个元素的集合,S=⟨a1a2,……an⟩S=⟨a1,a2,……,an⟩ ,现将S划分成k个满足下列条件的子集合S1S2,……SkS1,S2,……,Sk ,且满足:

1.Si ≠ ∅

2.Si ∩ Sj = ∅            (1≤i,j≤k  i≠j)

3.S1 ∪ S2 ∪ S3 ∪ … ∪ Sk = S

则称S1S2,……SkS1,S2,……,Sk 是集合S的一个划分。它相当于把S集合中的n个元素a1a2,……ana1,a2,……,an 放入k个(0<k≤n<30)无标号的盒子中,使得没有一个盒子为空。请你确定n个元素a1a2,……ana1,a2,……,an 放入k个无标号盒子中去的划分数S(n,k)。

输入

给出n和k。

输出

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

样例输入

10 6

样例输出

22827
/*对于任一元素a(n)有两种情况 1:a(n)存在于k个子集中,那么我们只需要把剩下的a(1)-a(n-1)划分到k-1个子集 则digui(i-1,j-1) 2.a(n)不是k个子集中的一个,那么a(n)必定和其他元素构成子集那么就是把a(1)-a(n-1)划分为k个子集然后把a(n) 任意放入一个子集则有j*digui(i-1,j) 递归关系就是:digui(i-1,j-1)+j*digui(i-1,j)*/  #include 
#include
using namespace std; int digui(int i,int j) { if(j==0||i
0&&i>j) return digui(i-1,j-1)+j*digui(i-1,j); } int main () { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { cout<
<

 

 

转载于:https://www.cnblogs.com/caiyishuai/p/8593689.html

你可能感兴趣的文章
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
我对前端MVC的理解
查看>>
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
对数器的使用
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>