选择多个组合(matlab)

Choose multiple combination (matlab)

我有 3 组数组,每组包含 12 个相同类型的元素

a=[1 1 1 1 1 1 1 1 1 1 1];
b=[2 2 2 2 2 2 2 2 2 2 2];
c=[3 3 3 3 3 3 3 3 3 3 3];

如果我一次需要取12件物品,我必须找到有多少种方法可以取货

here, 1 1 2 is same as 2 1 1

我找到了这个 link

何况这可以在合理的时间内在 matlab 中完成。

这样正确吗

abc=[a b c];
allcombs=nmultichoosek(abc,12);
combs=unique(allcombs,'rows');

如果您只需要找到 select 项的方法数,那么使用生成函数是一种非常有效的计算方法,即使对于相当大的 N 和 k 值也是如此。

如果您不熟悉生成函数,可以在此处阅读数学背景知识:

http://mathworld.wolfram.com/GeneratingFunction.html

这里:

http://math.arizona.edu/~faris/combinatoricsweb/generate.pdf

解决方案取决于这样一个事实,即从 36 个项目中选择 k 个项目的方法数,每个 3 个项目重复 12 次,可以从生成函数的乘积中确定:

g(x) = 1 + x + x^2 + x^3 + ... + x^12

自己3次。 12 是因为元素重复了 12 次(不是因为你选择了 12 次),而自乘 3 次是因为存在三组不同的元素。选择 12 个元素的方法数就是这个多项式乘积中 x^12 次方的系数(如果你想向自己证明它有效,请尝试较小的例子)。

最棒的是 MATLAB 有一个简单的函数 conv 用于乘以多项式:

>> g = ones(1,13);  %% array of 13 ones, for a 12th degree polynomial with all `1` coefficents
>> prod = conv(g, conv(g, g));  %% multiply g by itself 3 times, as a polynomial
>> prod(13)
ans = 
     91

所以有 91 种方法可以从 36 个列表中 select 12 个元素。如果你想 select 11 个元素,那就是 z(12) = 78。如果你想 select 13个元素,即z(14) = 102.

最后,如果集合中的元素数量不同,比如 10 1、12 2 和 14 3,那么你会有 3 个相同形式的不同多项式,1 + x + x^2 + ...,分别具有 10、12 和 14 次。再次检查 k 项的系数,您可以从该集合中选择 k 个元素。