Javascript 格雷普林编程挑战3级(Matlab)

Javascript 格雷普林编程挑战3级(Matlab),javascript,math,matlab,Javascript,Math,Matlab,在Greplin挑战级别3中,需要计算汇总到列表中另一个元素的子集数量。见和。 我也发现了,但我发现它远没有Python那么容易理解 我的问题是,是否有某种Matlab命令用于查找数组的所有子集,类似于python中的组合库? 如果您能在回答中提及挑战,我们将不胜感激 我试着写一些我自己的代码给它,但显然效果不太好 Nums = [3 4 9 14 15 19 28 37 47 50 54 56 59 61 70 73 78 81 92 95 97

在Greplin挑战级别3中,需要计算汇总到列表中另一个元素的子集数量。见和。 我也发现了,但我发现它远没有Python那么容易理解

我的问题是,是否有某种Matlab命令用于查找数组的所有子集,类似于python中的组合库? 如果您能在回答中提及挑战,我们将不胜感激

我试着写一些我自己的代码给它,但显然效果不太好

Nums = [3   4   9   14  15  19  28  37  47  50  54  56  59  61  70  73  78  81  92  95  97  99];
% Nums = [1, 2, 3, 4, 6];

SubsetCount = 0;
for Ind = 1:length(Nums)

    maxNum = Nums(Ind);
    s = setdiff( Nums, maxNum );
    NumSubsetsCountToIt = NumSubsetsCount( s,  maxNum);
    SubsetCount = SubsetCount + NumSubsetsCountToIt;

end
disp(SubsetCount);

function    NumSubsetsCountToIt = NumSubsetsCount( Nums, SumUpNum )
global OptionsToGetTo

NumSubsetsCountToIt = 0;
validNums = Nums;

if sum(validNums)==SumUpNum

    NumSubsetsCountToIt = 1;

else

    for Ind=length( validNums ):-1:1
        outNum = validNums(Ind);
        s = setdiff(validNums, outNum );
        NumSubsets = NumSubsetsCount( s, SumUpNum-outNum );
        NumSubsetsCountToIt = NumSubsetsCountToIt+NumSubsets;
    end
    NumSubsetsCountToIt = floor((NumSubsetsCountToIt+1)/2);

end

OptionsToGetTo(2, b) = NumSubsetsCountToIt;
您可以使用该功能一次查找
n
项的所有可能组合
k
。以竞赛为例:

values=[1,2,3,4,6];%# test vector
values=sort(values(:),'ascend');%#not needed here, but good to sort as indexing becomes easier in the end.
matchingSubsets=cell(numel(values)-1,1);%we don't need the trivial case of j=j. So, 1 less cell.

for i=2:numel(values)
    combinations=combnk(values,i);
    matchingSubsets{i-1}=combinations(sum(combinations(:,1:i-1),2)==combinations(:,i),:);%# this is where the sorting helps, as you now know that the last column is the max value.
end
结果是:

matchingSubsets{:}
ans =
   Empty matrix: 0-by-2

ans =
     2     4     6
     1     3     4
     1     2     3

ans =
     1     2     3     6

ans =
   Empty matrix: 0-by-5
要得到最终答案,即子集的数量

subsetSizes=cell2mat(cellfun(@size,matchingSubsets,'UniformOutput',false));
totalSubsets=sum(subsetSizes(:,1));

它给出了
totalSubsets=4

好的,更有趣的是对这个问题进行编码。如果N=[3,4,9,14,15,19,28,37,47,50,54,56,59,61,70,73,78,81,92,95,97,99];那么你能用多少个字符来解决这个问题呢?我的答案是54个字符。仅使用标准的MATLAB函数。到目前为止,我在MATLAB中最快的解决方案耗时0.6秒,代码高尔夫解决方案为2.29秒。到@woodchips:.6秒非常快。。使用下面的combnk功能需要30多秒。你能发布你的快速和高尔夫代码解决方案吗?但我会给出挑战的答案。不过我会给你一个提示。代码高尔夫解决方案(现在@52个字符)使用dec2bin(1:2^21-1)。矩阵乘法给出了不同的子集和。ismember会帮忙吗?然后你必须减去21个可能的单线态解。(快速)替代解决方案使用我的代码生成整数的分区,作为一组其他数字的总和。在联邦快递上。只需计算找到的解决方案的数量。