信息学奥赛一本通(1315:【例4.5】集合的划分)

1315:【例4.5】集合的划分


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 11952     通过数: 5318

【题目描述】

设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。

【输出】

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

【输入样例】

10 6

【输出样例】

22827

【分析】

        先举个例子,设 S={1,2,3,4},k=3,不难得出 S有6种不同的划分方案,即划分数 S(4,3)=6,具体方案为∶

        {1,2}U{3}U{4}                {1,3}U{2}U{4}             {1,4}U{2}U{3}

        {2,3}U{1}U{4)                {2,4}U{1>U{3)            {3,4}U{1}U{2}

        考虑一般情况,对于任意的含有n个元素 al ,a2,…,an 的集合 S,放入k个无标号的盒子中去,划分数为 S(n,k),我们很难凭直觉和经验计算划分数和枚举划分的所有方案,必须归纳出问题的本质。其实对于任一个元素 an,则必然出现以下两种情况:

        1. {an} 是k 个子集中的一个,于是我们只要把 al,a2,…,an-1 划分为 k-1子集,便解决了本题,这种情况下的划分数共有 S(n-1,k-1)个;

        2. {an} 不是k 个子集中的一个,则 an 必与其他的元素构成一个子集。则问题相当于先把 al,a2,…,an-1划分成 k 个子集,这种情况下划分数共有 S(n-1,k)个;然后再把元素 an 加入到 k 个子集中的任一个中去,共有 k 种加入方式,这样对于 an 的每一种加入方式,都可以使集合划分为 k 个子集,因此根据乘法原理,划分数共有k * S(n-1,k)个。

        综合上述两种情况,应用加法原理,得出 n个元素的集合 {al,a2,…,an} 划分为 k 个子集的划分数为以下递归公式∶S(n,k)=S(n-1,k-1)+k * S(n-1,k)(n>k,k>0)。

        下面,我们来确定 S(n,k)的边界条件,首先不能把 n 个元素不放进任何一个集合中去,即k=0 时,S(n,k)=0;也不可能在不允许空盒的情况下把n个元素放进多于n的 k 个集合中去,即k>n时,S(n,k)=0;再者,把 n个元素放进一个集合或把n个元素放进 n个集合,方案数显然都是1,即 k=1或 k=n 时,S(n,k)=1。

        因此,我们可以得出划分数 S(n,k)的递归关系式为∶

        S(n,k)=S(n-1,k-1)+k * S(n-1,k)        (n>k,k>0)

        S(n,k)=0                             (n<k)或(k=0)

        S(n,k)=1                            (k=1)或(k= n)

【参考代码】

#include<stdio.h>
long long s(int n,int k)
{
    if(n<k || k==0)
        return 0;
    if(k==1 || k==n)
    	return 1;
    else
        return s(n-1,k-1)+k*s(n-1,k);
}
int main()
{
    int k,n;
    scanf("%d%d",&n,&k);
    printf("%lld\n",s(n,k));
    return 0;
}

http://ybt.ssoier.cn:8088/problem_show.php?pid=1315

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息学奥赛一本通1255:迷宫问题是一个关于迷宫的问题。这个问题要求通过广搜算法来解决迷宫问题,找到走出迷宫的路径。具体来说,迷宫可以看成是由n×n的格点组成,每个格点只有两种状态, "." 和 "#" 。其中 "." 代表可通行的路径,"#" 代表不可通行的墙壁。通过广搜算法,我们可以搜索从起点到终点的路径,找到一条合法的路径即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [信息学奥赛一本通 1255:迷宫问题 | OpenJudge NOI 2.5 7084:迷宫问题](https://blog.csdn.net/lq1990717/article/details/124721407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [c++信息学奥赛一本通1215题解](https://download.csdn.net/download/Asad_Yuen/87357807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [信息学奥赛一本通(1255:迷宫问题)](https://blog.csdn.net/lvcheng0309/article/details/118879231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值