一行中有n个项目。我们必须找到可以选择项目的方式的数量,但不能选择两个连续的项目。
我尝试使用递归关系但不能达到任何关系。请帮我解决问题。
答案 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
。
对于第三个最合适的项目,有一种方法可以选择它只选择该项目,然后你必须添加选择每个可能被选择的项目的方式的数量(这是第二个循环是为了)。因此该项目包含:00100
和00101
。
第四最合适的项目:01000
,01010
,01001
。
最正确的项目(左侧第一项):10000
,10100
,10101
,10010
,10001
。
因此,n = 5的数组将以这些值结束:{5,3,2,1,1}
然后总数将是:5 + 3 + 2 + 1 + 1 = 12
答案 2 :(得分:0)
这是一个简单的解决方案。
假设您需要从前100个自然数中选择3个数字,这样就不会有两个连续。
考虑前98个自然数,并以98C3
方式随机选择3个自然数( a , b , c )
我们知道0 < a
,b
,c < 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 < A
,B
,C<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中完成。 希望你能理解。