创建多个组合,总计为100

时间:2011-03-09 11:56:19

标签: algorithm vba

我希望能够创建多个总和为100%的组合,给定定义数量的“桶”并定义“差异因子”。在下面的例子中,差异是20倍,使其变得简单,但我可能会在最终解决方案中将其减少到1。

例如,使用3“桶”A,B,C,您可以:

A     100     80      80      60      60  ...   0
B     0       20      0       20      40  ...   0
C     0       0       20      20      0   ...   100

每列是我想存储的一个组合(总和为100)并进行进一步的计算。

这是一个商业问题,而不是家庭作业。

请帮我提出一个解决方案。蛮力方式是为每种可能的组合创建一个多维数组,例如: 100x100x100,然后通过每个100万组合看看哪些总和为100.但这看起来效率太低。

非常感谢。我希望我已经解释清楚了。

3 个答案:

答案 0 :(得分:4)

这个问题被称为partitions,而不是组合,这是不同的。

首先关闭:'差异因素'只是将问题从找到100的分区变为(在你的例子中)找到5的分区(然后乘以20)。

接下来:如果桶的数量是常数,你可以做(​​伪代码):

for i = 0 to n
  for j = 0 to n-i
    output (i, j, n-(i+j))

如果桶的数量是动态的,你必须更聪明,但这种方法基本上可以工作。

答案 1 :(得分:1)

看起来它可以很好地缓存和动态编程。

fun partition (partitions_left, value):
  if partitions_left == 0
    return empty_list

  if value == 0:
    return list of list of partitions_left 0 elements

  return_value = empty_list
  for possible_value from value downto 1:
    remainder = value-possible_value
    children = partition(partitions_left-1, remainder)
    for child in children:
     append (cons of possible_value and child) to return_value

  return return_value

如果您还确保从缓存中提供已经计算的值,那么您需要做的就是生成所有生成分区的所有可能排列。

答案 2 :(得分:0)

算法方面,您可以在列表A中以20的步长制作0到100之间的所有数字的列表,然后将列表A的副本复制为列表B.

接下来,将列表A的每个值与列表B进行比较,查看哪些值加起来为100或更少,并将这些值的记录存储在列表C中。接下来,再次列出C(检查0和0之间的所有值) 100步骤为20)以查看哪些值加起来为100。