在一个约束下在Matlab中找到可能的组合的算法?

问题描述:

一个很简单的例子:在一个约束下在Matlab中找到可能的组合的算法?

A=[100 250 300]

如何,只要每个组合有小于500的总和找到所有可能的组合?

+0

是您的阵列总是大小为3? – miy 2013-02-16 22:51:22

+0

要澄清,对于上面的例子,你想返回[250 100],[100],[250],[300],[300 100]? – learnvst 2013-02-16 22:52:19

+0

@miy是的,它是固定的。 – NLed 2013-02-16 22:53:46

这个简单的代码

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

+0

你能解释如何删除重复?我无法让它工作。 – NLed 2013-03-02 17:30:37

+0

查看“unique”的文档,特别是关于'C = unique(A,'rows')' – learnvst 2013-03-04 11:05:47

此代码应该工作。结果将存储单元阵列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);