Javascript 格雷普林编程挑战3级(Matlab)
在Greplin挑战级别3中,需要计算汇总到列表中另一个元素的子集数量。见和。 我也发现了,但我发现它远没有Python那么容易理解 我的问题是,是否有某种Matlab命令用于查找数组的所有子集,类似于python中的组合库? 如果您能在回答中提及挑战,我们将不胜感激 我试着写一些我自己的代码给它,但显然效果不太好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
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个可能的单线态解。(快速)替代解决方案使用我的代码生成整数的分区,作为一组其他数字的总和。在联邦快递上。只需计算找到的解决方案的数量。