看起来你想知道有多少子多集有,比如 3 个元素。这个数学变得非常棘手,非常快。这个想法是你想把到达那里的所有方式组合在一起。所以你有 C(3,4) = 4 种没有重复元素的方法。B 可以以 C(1,3) = 3 种方式重复两次。B 可以以 1 种方式重复 3 次。并且 C 可以以 C(1,3) = 3 种方式重复两次。总共11个。(你手头的 10 错了。对不起。)
一般来说,试图做到这一点太难了。跟踪它的更简单方法是写出一个多项式,其系数具有您想要的项,您可以将其相乘。对于帕斯卡三角形,这很容易,多项式是 (1+x)^n。(您可以使用重复平方来更有效地计算。)在您的情况下,如果一个元素重复两次,您将有一个 (1+x+x^2) 因子。3 次将是 (1+x+x^2+x^3)。因此,您的具体问题将解决如下:
(1 + x) (1 + x + x^2 + x^3) (1 + x + x^2) (1 + x)
= (1 + 2x + 2x^2 + 2x^3 + x^4)(1 + 2x + 2x^2 + x^3)
= 1 + 2x + 2x^2 + x^3 +
2x + 4x^2 + 4x^3 + 2x^4 +
2x^2 + 4x^3 + 4x^4 + 2x^5 +
2x^3 + 4x^4 + 4x^5 + 2x^6 +
x^4 + 2x^5 + 2x^6 + x^7
= 1 + 4x + 8x^2 + 11x^3 + 11x^4 + 8x^5 + 4x^6 + x^7
如果您想在代码中生成这些数字,我会使用多项式技巧来组织您的思维和代码。(您将使用系数数组。)