【问题标题】:Arranging group of numbers to fit Specific size total排列数字组以适合特定尺寸总计
【发布时间】:2012-06-09 01:27:17
【问题描述】:

我在一个组中有几个不同的数字,大小不一,我想根据组的最大大小来计算这些数字应该进入哪个组。

数字示例:10,20,30,40,50,60

条件示例:一组数字加起来的最大总数 是 60

所以从上面的例子中答案是:

第 1 组的数字为 10、20、30

第 2 组的编号为 40

第 3 组的编号为 50

第 4 组的编号为 60

在 matlab/octave 或 excel/librecalc 中有没有可以计算的方法?

PS:一个组也可以有40号和20号,组总数不能超过60。但是每个号码只能使用一次。

有没有用于此的数学术语?

【问题讨论】:

  • 您似乎正在尝试解决bin-packing problem。我不确定是否有一个特定的数学术语适用于您想要实现的目标,但它属于“组合优化”的范畴。要完全回答您的问题,可以计算,但您要使用哪个应用程序取决于您。

标签: excel matlab octave combinatorics libreoffice


【解决方案1】:

编辑:

下面的解决方案使用蛮力方法来生成powersets 的 powersets(尽管经过修剪)。然后检查满足条件集的组(即将所有数字分组,使得没有一个组包含超过 60 的总和)。我从PMTK3 工具箱中的powerset.m 函数中借用了一些代码。

对于像这样的小问题,这应该可以正常工作,但我怀疑对于更大的输入,它的大小会成倍增长。我确信那里有更好的启发式/算法,所以以此为起点......

%# set of numbers
S = [10,20,30,40,50,60];

%# powerset of S (exclude empty set)
b = (dec2bin(2^numel(S)-1:-1:1) == '1');
P = cellfun(@(idx)S(idx), num2cell(b,2), 'UniformOutput',false);

%# keep only sets where the sum is at most 60
P = P(cellfun(@sum,P) <= 60);

%# take the powerset of the powerset, although we can
%# reduce it to no more than numel(S) subsets in each.
%# The idea here is: nchoosek(p,1:numel(s))
b = (dec2bin(2^numel(P)-1:-1:1) == '1');
b = b(sum(b,2)<=numel(S),:);
PP = cellfun(@(idx)P(idx), num2cell(b,2), 'UniformOutput',false);

%# condition: every number appears exactly once in groups
ppp = cellfun(@(x) [x{:}], PP, 'UniformOutput',false);
idx = find(cellfun(@numel,ppp) == numel(S));
idx2 = ismember(sort(cell2mat(ppp(idx)),2), S, 'rows');
PP = PP( idx(idx2) );

%# cleanup, and show result
clearvars -except S PP
celldisp(PP)

这给了我 12 个解决方案。例如:

>> PP{1}{:}
ans =
    10    20    30
ans =
    40
ans =
    50
ans =
    60

>> PP{6}{:}
ans =
    10    40
ans =
    20
ans =
    30
ans =
    50
ans =
    60

>> PP{12}{:}
ans =
    10
ans =
    20
ans =
    30
ans =
    40
ans =
    50
ans =
    60

【讨论】:

  • 这看起来很有希望,但我怎样才能使代码只使用每个数字一次?
  • @RickT:哦,好吧,现在我重新阅读了这个问题,我意识到这只是问题的一半......你想将所有数字分配到组中,这样没有组包含超过 60 的总和,对吗?一个问题,你想要所有这些可能的解决方案还是只想要其中一个?
  • 我现在只需要其中一个,但我正在考虑做所有可能的解决方案。你的想法比我先一步;-)
  • @RickT:我修改了答案以返回所有可能的解决方案。不是最有效的方法,但可以完成工作:)
  • 这似乎正是我要找的,只是如何将其转换为在 excel、javascript、php 中使用?
猜你喜欢
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多