我有一个代码可以在两个小于特定值的数组之间寻找最佳组合。该代码一次仅使用数组 B 的每一行中的一个值。
B =
1 2 3
10 20 30
100 200 300
1000 2000 3000
我使用的代码是:
B=[1 2 3; 10 20 30 ; 100 200 300 ; 1000 2000 3000];
A=[100; 500; 300 ; 425];
SA = sum(A);
V={}; % number of rows for cell V = num of combinations -- column = 1
n = 1;
for k = 1:length(B)
for idx = nchoosek(1:numel(B), k)'
rows = mod(idx, length(B));
if ~isequal(rows, unique(rows)) %if rows not equal to unique(rows)
continue %combination possibility valid
end %Ignore the combination if there are two elements from the same row
B_subset = B(idx);
if (SA + sum(B_subset) <= 2000) %if sum of A + (combination) < 2000
V(n,1) = {B_subset(:)}; %iterate cell V with possible combinations
n = n + 1;
end
end
end
但是,我想以不同于此代码将它们存储在单元格中的方式显示结果。
而不是在单元格中显示结果,V
例如:
[1]
[10]
[300]
[10;200]
[1000;30]
[1;10;300]
这是首选:(每行 X 列在单元格中占据特定位置)这里,这意味着它们应该排列为cell(1,1)={[B(1,x),B(2,y),B(3,z),B(4,w)]}
。x y z w
具有所选值的列在哪里。所以显示的输出是:
[1;0;0;0]
[0;10;0;0]
[0;0;300;0]
[0;10;200;0]
[0;30;0;1000]
[1;10;300;0]
在每个答案中,通过从矩阵 B 的第 1 到第 4 行中选择一个值来确定组合。每行有 3 列,并且每行一次只能选择一个值。但是,如果不能使用例如 B(1,2),它将被替换为零。例如,如果第 1 行B
不能使用,那么B(1,1:3)
将是单个 0。结果将是 [0;x;y;z]。
- 因此,如果
2
从第1 行中选择,并且20
从第2 行中选择,而第3和第 4行不包括在内,它们应该显示 0。所以答案将是 [2;20;0;0]。 - 如果仅使用第 4 行(例如 1000),则答案应为 [0;0;0;1000]
总之,我想实现以下内容:
- 每个单元格包含
length(B)
B 中每一行的值(基于组合) - 未用于组合的每个值都应为 0 并打印在单元格中
我目前正在尝试实现这一点,但我的方法不起作用..如果您需要更多信息,请告诉我。
编辑
我已尝试在下面的 dfb 答案中实现代码,但遇到困难,请查看答案,因为它包含解决方案的一半。