确定集{1,2,3,...,n}的所有连续子集。子集应至少包含2个元素

时间:2015-03-02 18:34:47

标签: algorithm computer-science combinatorics set-theory

我需要对由连续数字组成的集S={1, 2, 3, … , n}进行分区,使每个子集至少有2个元素(规则1),并且它由连续数字组成(规则2)。

规则是:

  
      
  1. 每个子集至少有两个元素。

  2.   
  3. 所有子集的所有元素都是连续的。

  4.   
  5. S的所有元素都包含在分区中。

  6.   

示例:

There is 1 subset for n = 2: 
1 2
There is 1 subset for n = 3:  
1 2 3   
There are 2 subset combinations for n = 4:
1 2 3 4
1 2 - 3 4
There are 3 subset combinations for n = 5:
1 2 3 4 5
1 2 - 3 4 5
1 2 3 - 4 5
There are 5 subset combinations for n = 6:
1 2 3 4 5 6
1 2 - 3 4 5 6
1 2 3 - 4 5 6
1 2 3 4 - 5 6
1 2 - 3 4 - 5 6
There are 8 subset combinations for n = 7:
1 2 3 4 5 6 7
1 2 - 3 4 5 6 7
1 2 3 - 4 5 6 7
1 2 3 4 - 5 6 7
1 2 3 4 5 - 6 7
1 2 - 3 4 - 5 6 7
1 2 - 3 4 5 - 6 7
1 2 3 - 4 5 - 6 7
There are 13 subset combinations for n = 8:
1 2 3 4 5 6 7 8
1 2 - 3 4 5 6 7 8
1 2 3 - 4 5 6 7 8
1 2 3 4 - 5 6 7 8
1 2 3 4 5 - 6 7 8
1 2 3 4 5 6 - 7 8
1 2 - 3 4 - 5 6 7 8
1 2 - 3 4 5 - 6 7 8
1 2 - 3 4 5 6 - 7 8
1 2 3 - 4 5 - 6 7 8 
1 2 3 - 4 5 6 - 7 8
1 2 3 4 - 5 6 - 7 8
1 2 - 3 4 - 5 6 - 7 8
There are 21 subset combinations for n = 9:
1 2 3 4 5 6 7 8 9
1 2 - 3 4 5 6 7 8 9
1 2 3 - 4 5 6 7 8 9
1 2 3 4 - 5 6 7 8 9
1 2 3 4 5 - 6 7 8 9
1 2 3 4 5 6 - 7 8 9
1 2 3 4 5 6 7 - 8 9
1 2 - 3 4 - 5 6 7 8 9
1 2 - 3 4 5 - 6 7 8 9
1 2 - 3 4 5 6 - 6 7 9
1 2 - 3 4 5 6 7 - 8 9
1 2 3 - 4 5 - 6 7 8 9 
1 2 3 - 4 5 6 - 7 8 9
1 2 3 - 4 5 6 7 - 8 9
1 2 3 4 - 5 6 - 7 8 9
1 2 3 4 - 5 6 7 - 8 9
1 2 3 4 5 - 6 7 - 8 9
1 2 - 3 4 - 5 6 - 7 8 9
1 2 - 3 4 - 5 6 7 - 8 9
1 2 - 3 4 5 - 6 7 - 8 9
1 2 3 - 4 5 - 6 7 - 8 9
There are 34 subset combinations for n = 10:
1 2 3 4 5 6 7 8 9 10
1 2 - 3 4 5 6 7 8 9 10
1 2 3 - 4 5 6 7 8 9 10
1 2 3 4 - 5 6 7 8 9 10
1 2 3 4 5 - 6 7 8 9 10
1 2 3 4 5 6 - 7 8 9 10
1 2 3 4 5 6 7 - 8 9 10
1 2 3 4 5 6 7 8 - 9 10
1 2 - 3 4 - 5 6 7 8 9 10
1 2 - 3 4 5 - 6 7 8 9 10
1 2 - 3 4 5 6 - 6 7 9 10
1 2 - 3 4 5 6 7 - 8 9 10
1 2 - 3 4 5 6 7 8 - 9 10
1 2 3 - 4 5 - 6 7 8 9 10
1 2 3 - 4 5 6 - 7 8 9 10
1 2 3 - 4 5 6 7 - 8 9 10
1 2 3 - 4 5 6 7 8 - 9 10
1 2 3 4 - 5 6 - 7 8 9 10
1 2 3 4 - 5 6 7 - 8 9 10
1 2 3 4 - 5 6 7 8 - 9 10
1 2 3 4 5 - 6 7 - 8 9 10
1 2 3 4 5 - 6 7 8 - 9 10
1 2 3 4 5 6 - 7 8 - 9 10
1 2 - 3 4 - 5 6 - 7 8 9 10
1 2 - 3 4 - 5 6 7 - 8 9 10
1 2 - 3 4 - 5 6 7 8 - 9 10
1 2 - 3 4 5 - 6 7 - 8 9 10
1 2 - 3 4 5 - 6 7 8 - 9 10
1 2 - 3 4 5 6 - 7 8 - 9 10
1 2 3 - 4 5 - 6 7 - 8 9 10
1 2 3 - 4 5 - 6 7 8 - 9 10
1 2 3 - 4 5 6 - 7 8 - 9 10
1 2 3 4 - 5 6 - 7 8 - 9 10
1 2 - 3 4 - 5 6 - 7 8 - 9 10

我没有把它们写在这里但是n = 11有55个子集组合,n = 12有89个子集组合。

我需要编写一个Visual Basic代码,列出n的所有可能子集组。我一直在考虑解决方案,但似乎问题的解决方案超出了我的能力范围。所需嵌套循环的数量随着n的增加而增加,我无法弄清楚如何用越来越多的数字编写嵌套循环。任何帮助将不胜感激。

经过一些研究,我发现这是&n;所有部分的组成&n;> 1"可能的成分总数是斐波那契数(n为Fn-1)。

2 个答案:

答案 0 :(得分:0)

我对你的回答是尝试提出给定模式的递归关系。递归思考。我怎样才能将这个问题分解为更小的子问题,直到达到最小的问题。解决那个最小的问题。解决了这个最小的问题后,请考虑归纳。假设第n步将是什么以及你将如何达到第(n + 1)步。尝试解决第(n + 1)步。一旦你对给出的模式提出了递归关系,考虑如何递归地解决这个模式应该不会太难。这种方法可能更直观,而不是尝试使用嵌套循环。

答案 1 :(得分:0)

我们已经知道这些案例的答案(正如您在示例中所写的那样):

  1. n = 2
  2. n = 3
  3. n = 4的
  4. 对于n = 5:

    • 您可以从2:1 2 - 3 4 5进行分区。这就像将5个成员集划分为两个集合,第一个n = 2,第二个n = 3。我们现在可以继续划分每一半,但我们已经知道当n = 2且n = 3时的解决方案!
    • 你可以从3:1 2 3 - 4 5进行分区。这就像将5个成员集分为两个集合,第一个n = 3,第二个n = 2。我们现在可以继续划分每一半,但我们已经知道当n = 2且n = 3时的解决方案!

    对于n = 6:

    • 你可以从2:1 2 - 3 4 5 6分成两组。这就像把6个成员组分成两组,第一组n = 2,第二组n = 4。我们现在可以继续划分每一半,但是当n = 2时我们已经知道了解。通过假设n = 4来解决后半部分。
    • 你可以从3:1 2 3 - 4 5 6分成两组。这就像把6个成员组分成两组,第一个n = 3,第二个n = 3,我们现在可以继续分割每一半,但我们已经知道当n = 3且n = 3时的解决方案!
    • 你可以从3:1 2 3 4 - 5 6分成两组。这就像将6个成员组分成两组,第一个n = 4,第二个n = 2,我们现在可以继续分割每一半。通过设置n = 4来解决前半部分。对于下半年,当n = 2时,我们已经知道了解决方案。

    这是一个简单的递归关系。一般情况:

    Partition (S): (where |S|>4)
    - For i from 2 to |S|-2, partition the given set into two halves: s1 and s2 from i (s1={1,...,i}, s2={i+1,...,n}), and print the two subsets as a solution.
    - Recursively continue for each half by calling Partition(s1) and Partition(s2)
    

    ---

    另一个更难的解决方案是假设我们将数字1 to n划分为n个部分,其中每个部分的长度可以是02或大于2的数字。换句话说,让xi为每个部分的长度:

    x1 + x2 + ... xn = n, where the range of xi is: {0} + [2,n]
    

    这是一个线性不等式系统,可以通过here描述的方法解决。