集合划分问题

该博客讨论了集合划分问题,即如何将一个包含n个元素的集合划分为m个非空子集。当给定n和m时,算法通过递归方式计算可能的划分数量。介绍了基本情况(m=1或n=m时)的解决方案,并提出了递归公式F(n-1,m-1)+m*F(n-1,m)。提供了C++代码实现来计算这个问题。
摘要由CSDN通过智能技术生成

集合划分问题

问题描述:

n个元素的集合{1,2,…,n}可以划分为若干非空子集。例如,当n=4时,集合{1,2,3,4}可以划分为15个不同的非空子集如下:
在这里插入图片描述
下面的描述太多了,你们都是看了《计算机算法设计与分析》那本书来的吧?所以后面三行我就不描述了。(偷懒ing)
PS:集合{{1,2},3,4}由三个子集组成(书中描述的大致内容)

算法设计:

给定正整数n和m,计算出n个元素的集合{1,2,…,n}可以划分为多少个不同的由m个非空子集组成的集合

算法分析:

定义F(n,m)=此题的解
当m=1时,F(n,m)=1;
当n=m时,F(n,m)=1;

假设原集合有m个元素,后输入了n-m个元素,此时将输入的元素和原集合的1个元素合并成一个子集,则此时集合依旧有m个元素,或者将原集合的n-m+1个元素合并成一个子集,此时集合也是m个元素,则这两种合并方法,合并出来的集合的不同种类之和,则是我们需要想要得出的答案。
(上面一段话用了逆向的思维方式)
这两种方法所得到的表达式则为:
F(n-1,m-1)和F(n,m-1)*m
答案就等于: F(n-1,m-1)+F(n,m-1)*m
这样,则可以用递归的方法求出答案(在得出任一个递归的返回值之前,调用次数为2^n次)
代码如下:

#include<iostream>
using namespace std;
int F(int n,int m)
{
	if(m==1||m==n)
		return 1;
	else
		return F(n-1,m-1)+m*F(n-1,m);
}
int main()
{
	int n,m;
	cin>>n>>m;
	if(m==1||m==n)
	cout<<"1"<<endl;
	else
	if(m==0||n==0||n<m)
	cout<<"ÊäÈë´íÎó£¡"<<endl;
	else
	cout<<F(n-1,m-1)+m*F(n-1,m)<<endl;
	return 0;
}

拜拜

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值