我想创建一个非减少元素的组合。组合将是,
如果i = 10且w = 5,则组合的元素可以是从1到w的任何值,并且总和将等于i。
可能的组合如,
1 + 1 + 1 + 1 + 1 + 5
1 + 1 + 1 + 1 + 1 + 1 + 4
1 + 1 + 1 + 1 + 1 + 1 + 1 + 3
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 ......
但是1 + 1 + 1 + 7不是期望的组合,因为7大于w
如何使用MatLab获取组合?我需要获得i和w的更高值的组合,例如i = 20和w = 8。
谢谢
答案 0 :(得分:2)
您可以使用递归函数执行此操作。以下代码包含一个包装函数和执行实际工作的递归函数:
function result = partitions(s,M)
%// s: desired sum; M: maximum value
result = partitions_rec(s,1,M,s);
end
function mat = partitions_rec(s,m,M,n)
%// s: desired sum, m: minimum value; M: maximum value; n: number of entries
M = min(M,s);
if s==0
mat = zeros(1,n);
else
mat = [];
for ii = m:M;
aux = partitions_rec(s-ii,ii,M,n-1);
if size(aux,1)
mat = [ mat; ii*ones(size(aux,1),1) aux ];
end
end
end
end
示例:
>> result = partitions(5,3)
ans =
1 1 1 1 1
1 1 1 2 0
1 1 3 0 0
1 2 2 0 0
2 3 0 0 0
0表示没有数字。如果要删除零,则需要将结果放在单元格数组中,其中每个单元格都是一个非零值的向量:
result_cell = arrayfun(@(ii) result(ii, logical(result(ii,:))), 1:size(result,1), 'uniformoutput', 0);
在示例中,这将给出
>> result_cell{:}
ans =
1 1 1 1 1
ans =
1 1 1 2
ans =
1 1 3
ans =
1 2 2
ans =
2 3