我有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
我找到了这个链接Generating all combinations with repetition using MATLAB。
这可以在合理的时间内在matlab中完成。
是正确的
abc=[a b c];
allcombs=nmultichoosek(abc,12);
combs=unique(allcombs,'rows');
答案 0 :(得分:0)
如果您只需要找到选择项目的方法数量,那么使用生成函数是一种非常有效地计算它的方法,即使对于相当大的N和k值也是如此。
如果您不熟悉生成函数,可以在此处阅读数学背景:
http://mathworld.wolfram.com/GeneratingFunction.html
在这里:
http://math.arizona.edu/~faris/combinatoricsweb/generate.pdf
解决方案取决于以下事实:从36个中选择k
个项目的方式数量,每个项目重复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的列表中选择12个元素。如果你想选择11个元素,那就是z(12)
= 78.如果你想选择13个元素,那就是z(14)
= 102.
最后,如果你在集合中有不同数量的元素,比如10 1
,12 2
和14 3
,那么你会有3个相同形式的不同多项式1 + x + x^2 + ...
,分别为10,12和14度。再次检查度k
项的系数会为您提供从该集合中选择k
元素的方法的数量。