Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Permutation 找到选择项目的总方法,以确保没有两个项目是连续的_Permutation_Combinatorics - Fatal编程技术网

Permutation 找到选择项目的总方法,以确保没有两个项目是连续的

Permutation 找到选择项目的总方法,以确保没有两个项目是连续的,permutation,combinatorics,Permutation,Combinatorics,一行中有n个项目。我们必须找到在不允许选择两个连续项目的限制下选择项目的方式 我试着用递归关系来做这件事,但没有达到任何目的。请帮我解决这个问题。我想您可以通过构建一个长度为n的数组来实现这一点,数组中的每个位置表示可以选择的项目数量,如果该位置是第一个选择的位置。(从左到右选择。) Psuedo代码(未测试): int[]列表=新的int[n]; int-total=0; 对于(int位置=n-1;位置>=0;位置--) { 列表[位置]=1; 对于(int subPos=position+2

一行中有n个项目。我们必须找到在不允许选择两个连续项目的限制下选择项目的方式


我试着用递归关系来做这件事,但没有达到任何目的。请帮我解决这个问题。

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

Psuedo代码(未测试):

int[]列表=新的int[n];
int-total=0;
对于(int位置=n-1;位置>=0;位置--)
{
列表[位置]=1;
对于(int subPos=position+2;subPos
说明:

此操作完成后,
list[i]
中的值表示从行中拾取项目的方式数,其中项目i是拾取的最左侧项目

显然,只有一种方式可以拾取项目,即最右边的项目是拾取的最左边的项目。如果n=5,则在这种情况下可以这样表示拾取:
00001

类似地,对于最右边的第二个项目,只有一种方法可以选择最左边的项目:
00010

对于第三个最右边的项目,有一种方法可以拾取它,即您只拾取该项目,然后您必须添加拾取可能第二个拾取的每个项目的方法数(这就是第二个循环的目的)。因此该项将具有:
00100
00101

最右边的第四项:
01000
01010
01001

最右边的第五项(左边的第一项):
10000
10100
10101
10010
10001

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


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

在网上搜索后,我得到了上述问题的答案

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

我们可以选择1到K个项目

  • 对于选择一个项目,我们可以选择任何项目
  • 为了选择两个项目,我们将N-2个项目保持在一个序列中。下面的圆圈表示序列中的项目。从第一项的左边到最后一项的右边,总共有N-1个空格。空格用下划线“u”表示。如果我们从任何空格中选择两个,并用item替换它们,那么我们将有N个项目,并且所选的两个项目将不连续,因为没有两个空格是连续的

                  _ o _ o _ o _ o _ o _ o _ o _ o _ o _ o _
    
  • 对于选择p项,我们将按顺序保留N-p项,这将导致N-p+1空格。我们可以从这些N-p+1空间中选择任意p空间

因此,所有可能的方法都将成为
NC1+N-1C2+N-2C3+…+N-K+1CK是前N个斐波那契数(1,1,2,3,5,…)的和。
前N个斐波那契数之和也是F(N+2)-1,这是一个简单的解

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

              _ o _ o _ o _ o _ o _ o _ o _ o _ o _ o _
考虑前98个自然数,以
98C3
的方式随机选择3个自然数(abc

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

A=A+0
<代码>B=B+1
<代码>C=C+2

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


0
B
C你解释为什么它是斐波那契级数的方式似乎很难理解。
我有一个更简单的解释方法,如下所示。
假设我们将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)时间复杂度计算。

Ans)(n+1-r)cr

假设我们有n项。我们要选择或选择r项,确保不连续选择两个对象。我们将用“0”表示对象。 现在我们有一个00000000……0000{upton terms}的序列,现在当我们从'i'位置i={1,…,n}选择一个项目时,让我们把它表示为1。因此,如果我们从位置2选择一个项目,新序列将变成01000000…000{upton terms}。现在如果我们必须选择r元素,在我们正在设计的二进制序列中会有r1s。但有趣的是,在两个连续的1之间,可以有任意自然数的0。所以,如果我们把n-r(r1也会存在!)个零放在一起,那么总的n-r+1间隙(每个零的左右两侧)。然后我们必须将R1放置到位。我们可以从n-r+1个位置中选择r1s的位置。这可以在(n+1-r)C r中完成。
希望您能理解。

您能列举n=5的解决方案吗?我只找到了10种解决方案,
13524
和4种这种模式的滚动变体('352