选择多个组合(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
个元素。
我有 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
个元素。