在一个约束下在Matlab中找到可能的组合的算法?
答
这个简单的代码
A=[100 250 300];
p = perms(A);
for nn = 1:numel(A)
p(sum(p(:,1:nn), 2) < 500, 1:nn)
end
给出以下输出
ans =
300
300
250
250
100
100
ans =
300 100
250 100
100 250
100 300
如果要删除重复,如[300 100]和[100 300],只需使用sort
命令排序的值,然后你可以删除重复使用unique
答
此代码应该工作。结果将存储单元阵列C
在:
A = [100 250 300];
B = 500;
C = cell(0);
for i = 1:size(A,2)
D = nchoosek(A,i);
for j = 1:size(D,1)
if (sum(D(j,:)) < B)
C{end+1} = D(j,:);
end
end
end
或更紧凑:
A = [100 250 300];
B = 500;
C = cell(0);
for i = 1:size(A,2)
C = [C; num2cell(nchoosek(A,i),2)];
end
C = C(cellfun(@(x) sum(x), C) < B);
是您的阵列总是大小为3? – miy 2013-02-16 22:51:22
要澄清,对于上面的例子,你想返回[250 100],[100],[250],[300],[300 100]? – learnvst 2013-02-16 22:52:19
@miy是的,它是固定的。 – NLed 2013-02-16 22:53:46