JAVA实现集合划分问题

/*集合划分问题:
 * n个元素的集合{1,2,.,n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15个不同的非空子集如下: 
{1},{2},{3},{4}}, {{1,2},{3},{4}}, 
{{1,3},{2},{4}}, {{1,4},{2},{3}}, 
{{2,3},{1},{4}}, {{2,4},{1},{3}}, 
{{3,4},{1},{2}}, {{1,2},{3,4}}, 
{{1,3},{2,4}}, {{1,4},{2,3}}, 
{{1,2,3},{4}}, {{1,2,4},{3}}, 
{{1,3,4},{2}}, {{2,3,4},{1}}, 
{{1,2,3,4}} 
其中,集合{{1,2,3,4}} 由1个子集组成;集合{{1,2},{3,4}},{{1,3},{2,4}},{{1,4},{2,3}},{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{2,3,4},{1}} 由2个子集组成;集合{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4}.{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}} 由3 个子集组成;集合{{1},{2},{3},{4}} 由4个子集组成。 
编程任务: 
给定正整数n 和m,计算出n 个元素的集合{1,2,., n }可以划分为多少个不同的由m 个 
非空子集组成的集合。 
数据输入: 
由文件input.txt 提供输入数据。文件的第1 行是元素个数n 和非空子集数m。 
结果输出: 
程序运行结束时,将计算出的不同的由m个非空子集组成的集合数输出到文件output.txt中。 
输入文件示例输出文件示例 
input.txt output.txt 
5 52 
解题思路
这道题如果要一次性想出来,有很大的难度,
不妨设f(n,m)   --n个元素(1.。。n)子集划分数m个
我是在学递归的时候,遇到这道题的,所以首先想到了递归
f(n-1,m)  --n-1个元素(1.。。n-1)子集划分数m个
1、f(n,m)是在此基础上加了第n个元素,而且划分数没变
那么在每一种f(n-1,m)的方式中第n个元素放都有m个位置可以放
有f(n,m)=m*f(n-1,m)
2、只有一种可能了,f(n-1,m-1)表示n-1个元素(1.。。n-1)子集划分数m-1个
现在我们要求f(n,m) --n个元素(1.。。n)子集划分数m个
多了一个,那好,把第n个元素添加进去。总数不变
f(n,m)=f(n-1,m-1);
根据组合原理,有两种可能
那么f(n,m)=f(n-1,m-1)+m*f(n-1,m);
递归出口:
当m=1时f(n,m)=1;
n=1时f(n,m)=1;
n=m是f(n,m)=1;
m不可能大于n
 * */
public class Test {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
     Split sp = new Split(5);
     sp.Sum();
}


}
class Split{
int n;
Split(int  k){
n=k;
}
void Sum(){
int count=0;
for(int i=1;i<=n;i++){
count+=DiGui(n,i);
}
System.out.println("总划分数:"+count);
}

int DiGui(int n,int m){
if(m>n)DiGui(n,n);
if(n==1||m==1||n==m) return 1;
else
return DiGui(n-1,m-1)+m*DiGui(n-1,m);
}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值