算法设计与分析: 2-8 集合划分问题

Posted shallow920

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法设计与分析: 2-8 集合划分问题相关的知识,希望对你有一定的参考价值。

技术图片技术图片

 1 package cn.htu.test;
 2 /**
 3  * 分析:
 4  * 设n个元素的集合可以划分为S(n,m)个不同的由m个非空子集组成的集合。
 5 S(n,m)的两种情况:
 6 一种是独自组成一个集合,另一种是和别的元素混在一起。
 7 对於第一种情况,等价于把前n-1个元素分成m-1份,然后n号元素单独放。
 8 对於第二种情况,等价于把前n-1个元素分成m份,然后把n号元素放入这m个集合中的一个(有m种放法)
 9 推出:
10 S(n,m) = S(n-1,m-1) + m * S(n-1,m)
11 得出这个式子至关重要,而我们所要求的就是{{  },{  },{  }},有几个这样的外层大括号
12  */
13 import java.util.Scanner;
14 
15 public class JiHeHuaFen {
16 
17     public static void main(String[] args) {
18         Scanner input = new Scanner(System.in);
19 
20         while (true){
21             long sum = 0;//总数sum用来装有多少个这样的集合即外层大括号
22 
23             System.out.println("Input n: ");//n就是集合的元素数
24             //当然,这里要注意的是整道题的非空子集的概念和数学平常遇到的非空子集的概念是不同的
25             int n = input.nextInt();
26 
27             System.out.println("Input m: ");
28             int m = input.nextInt();
29 
30             sum = S(n, m);
31 
32             System.out.println("There are "+sum+" different sets!");
33             System.out.println("----------------------------------------");
34         }
35     }
36 
37     //递归函数
38     private static long S(int n, int m){
39         if((n < m) || (m == 0))
40             return 0;//如果n不够m分或者不用分(即m==0),则得到的划分外层的大括号个数为0
41         if((m == n) || (m == 1))
42             return 1;
43         //例如如果4个元素划分为m=4,即{{},{},{},{}}的话得到只有这一种结果
44         //再比如4个元素划分为m=1,即{{}},得到也只有一种结果,这就是集合划分的"内满"和"外满"
45 
46         return m*S(n-1, m) + S(n-1, m-1);
47         //以上两种特殊情况都不是的话就是正常的两种情况了,前面的分析已经说过了
48     }
49 }

 

以上是关于算法设计与分析: 2-8 集合划分问题的主要内容,如果未能解决你的问题,请参考以下文章

算法设计与分析——划分问题(动态规划)

算法分析与设计实验报告 Project5

算法分析与设计论文

随机选择第k小元素随机快速排序-算法设计与分析实验四

随机选择第k小元素随机快速排序-算法设计与分析实验四

随机选择第k小元素随机快速排序-算法设计与分析实验四