繁体   English   中英

如何找到选择3种类型的k个对象的方式数量

[英]how to find the number of ways of choosing k objects of 3 types

给您一个整数k和3种类型的对象-A,B和C,每种类型都有大量的对象。 您可以用多少种方式排列k对象,以便您可以选择任意次数的任何类型的对象,但要限制B始终位于A和C之间,或者C和A之间。

例如,如果k为3,则答案为:10解释:{AAA,AAC,ABC,ACA,ACC,CAA,CAC,CBA,CCA,CCC}

我试图使用动态编程来解决它,但是我不知道这是否是正确的方法。

我尝试过这样的事情: f(n) = 2*f(n-1) + f(n-2) ,其中您采用了大小为k的数组,而f(1) = 2 {A, C}f(2) = 4 {AA, AC, CA, CC}

因此,如果第(n-1)个字母是A或C,那么第n个字母可以是A或C,但是如果它是B,则第n个字母只能是互补的全名,即,如果第(n-2)个字母是A,则第n个字母为C,反之亦然。 但是我觉得我想念一些案件。

有没有更好的方法,有人可以帮助我吗?

将帖子

递归:

F(1) = 2
F(2) = 4
F(N) = 2 * F(N - 1) + F(N-2)

说明:任何有效的组合都以A或C结尾。
要进行n组合,我们可以将A和C都添加到任何(n-1)组合中-两个变体。
我们还有一个变体,增加了(n-2)种组合:xxxxC的BA和xxxxA的BC

令L为此类字符串的语言,而La和Lc为字符串分别以A或C结尾的语言的子集。

然后,我们可以编写明确的语法:

L = La | Lc
La = "A" | L + "A" | Lc + "BA"
Lc = "C" | L + "C" | La + "BC"

令L(n),La(n),Lc(n)为三种语言中每种语言的长度为n的字符串数。 通过对称,La(n)= Lc(n)= L(n)/ 2。

然后,从第二个方程式中,使用语法无歧义的事实,对于n> 1,La(n)= L(n-1)+ Lc(n-2),然后代入:L(n)= 2L(n-1)+ L(n-2)。 我们有L(0)= 0和L(1)= 2。

为了计算L,我们可以编写迭代代码(您可以将其称为动态编程):

def L(n):
    a, b = 0, 2
    for _ in xrange(n):
        a, b = b, a + 2 * b
    return a

或者,就像我们对斐波那契数列所做的那样,我们可以使用矩阵求幂来解决它,这可以在O(log n)算术运算中完成。

L(n) = the first component of [0 1]^n (0)
                              [1 2]   (2)

这是一个广义的解决方案。 假设您有n个对象,并且必须从其中选择k对象。 您可以从每种类型中选择x1,x2,x3..对象。 和他们的总和

x1+x2+x3...+xn=k 0<=xi

因此,假设您可以选择是否选择每个对象( 0<=xi ),答案将是(k+n-1)C(n-1)

这是积分方程的简单解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM