找到选择项目的总方式,使得没有两个是连续的

时间:2012-05-17 23:19:47

标签: permutation combinatorics

一行中有n个项目。我们必须找到可以选择项目的方式的数量,但不能选择两个连续的项目。

我尝试使用递归关系但不能达到任何关系。请帮我解决问题。

5 个答案:

答案 0 :(得分:5)

在网上搜索后,我得到了上述问题的解决方案。

说有N个项目。如果N是偶数,我们可以选择几乎N / 2个项目,使得没有两个是连续的,如果N是奇数,我们可以选择几乎(N + 1)/ 2个项目。设K是可以选择的最大项目。

我们可以选择1到K项。

  • 如需选择一项,我们可以选择任何项目。
  • 为了选择两个项目,我们按顺序保留N-2个项目。下面的圆圈表示序列中的项目。我们总共有N-1个空格从第一个项目的左边开始到最后一个项目的右边。空格由' _'表示。下划线。如果我们选择两个空格,并用item替换它们,那么我们将有N个项目,并且选中的两个项目将不连续,因为没有两个空格是连续的。

                  _ o _ o _ o _ o _ o _ o _ o _ o _ o _ o _
    
  • 为了选择p项,我们将N-p项保留在序列中,这将导致N-p + 1个空格。我们可以从这些N-p + 1个空格中选择任何p个空格。

所以可能的方式将成为总体 N C 1 + N-1 C 2 + N-2 C < sub> 3 + ... + N-K + 1 C K 是前N个Fibonacci数的和(1,1,2,3, 5,...)。
前N个Fibonacci数的总和也是F(n + 2)-1

答案 1 :(得分:0)

我认为你可以通过构建一个长度为n的数组来实现这一点,数组中的每个位置表示如果该位置是第一个被选中的项目,则可以选择项目的方式。 (从左到右选择。)

Psuedo代码(未经测试):

int[] list = new int[n];
int total = 0;

for(int position = n-1; position >= 0; position--)
{
    list[position] = 1;
    for(int subPos = position + 2; subPos < n; subPos++)
    {
        list[position] += list[subPos];
    }
    total += list[position];
}

说明:

list[i]此值完成后的值表示从项目i中挑选项目的方式的数量,其中项目i是最后选择的项目。

显然,只有一种方法可以选择项目,这样最右边的项目就是最左边的项目。如果n = 5,那么在这种情况下,选择可以表示为:00001

同样,对于第二个最右边的项目,只有一种方法可以选择项目,使其成为最左侧的项目:00010

对于第三个最合适的项目,有一种方法可以选择它只选择该项目,然后你必须添加选择每个可能被选择的项目的方式的数量(这是第二个循环是为了)。因此该项目包含:0010000101

第四最合适的项目:010000101001001

最正确的项目(左侧第一项):1000010100101011001010001

因此,n = 5的数组将以这些值结束:{5,3,2,1,1}

然后总数将是:5 + 3 + 2 + 1 + 1 = 12

答案 2 :(得分:0)

这是一个简单的解决方案。

假设您需要从前100个自然数中选择3个数字,这样就不会有两个连续。

考虑前98个自然数,并以98C3方式随机选择3个自然数( a b c

我们知道0 < abc < 99|a-b||b-c||a-c| >= 1(因为 a b c 不同。

A=a+0; B=b+1; C=c+2;

所以我们现在知道 A B C 中的任何两个之间的差异大于1(即 A B C 不能是连续数字。)

0 < ABC<101 A B C 满足所需问题的所有条件。

所以解决方案是98 C 3

概括→从 N 中选择 p 项目,使得没有两个是连续的(N-p-1) C p

答案 3 :(得分:0)

似乎很难理解你解释为什么它是Fibonacci系列的方式。 我有一个更简单的解释方式如下。 假设我们将n个项目的组合数表示为T(n)。 如果我们不选择第一项,那么组合的数量与剩余的n-1项的组合数相同,即T(n-1)。 如果我们选择第一项(我们不能选择第二项,因为它连续到第一个位置),那么组合的数量与剩余的n-2项的组合数相同,即T(n-2)。 因此得出以下结论。

T(n) = T(n-1) + T(n-2).
T(1) = 2 (1. selected and 2. not selected)
T(2) = 3 (1. both not selected, 2. only first selected, 3. only second selected)

这是斐波那契数列,可以用O(n)时间复杂度计算。

答案 4 :(得分:0)

Ans)(n + 1-r)C r

假设我们有n个项目。并且我们要选择或选择r个项,以确保没有连续选择两个对象。我们将表示对象为“ 0”。 因此,现在我们有了一个序列000000000 ....... 0000 {up to n terms}现在,当我们从第i个位置i = {1,......,n}中选择一个项目时,让我们将其表示为1。因此,如果我们从位置2选择一项,则新序列将变为01000000 .... 000 {up to n term}。现在,如果我们必须选择r个元素,我们正在设计的二进制序列中将有r 1 s个。但有趣的是,在两个连续的1 s之间,可以有任意自然的0。因此,如果我们将n个零放置在一起,则总共有n + 1个间隙(每个零的左侧和右侧)。然后,我们必须将r 1放置在适当的位置。我们可以从n + 1个位置中选择r 1 s的位置。这可以在(n + 1-r)C r中完成。 希望你能理解。