Algorithm 创建多个总和为100的组合

Algorithm 创建多个总和为100的组合,algorithm,vba,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%的组合,给定定义数量的“桶”和定义的“差异系数”。在下面的示例中,差是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。然而,这看起来效率太低了


非常感谢。我希望我解释得足够清楚。

算法方面,您可以在列表a中以20为单位列出0到100之间的所有数字,然后将列表a复制为列表B


接下来,将列表A的每个值与列表B进行比较,查看哪些值加起来等于或小于100,并将这些值的记录存储在列表C中。接下来,再次对列表C执行相同操作(检查0和100之间的所有值,步骤为20)要查看哪些值加起来等于100。

算法方面,您可以在列表a中以20为单位列出0到100之间的所有数字,然后将列表a复制为列表B

接下来,将列表A的每个值与列表B的值进行比较,查看哪些值加起来等于或小于100,并将这些值的记录存储在列表C中。接下来,再次对列表C执行相同操作(检查0和100之间的所有值,步骤为20),查看哪些值加起来等于100。

此问题称为组合,而不是组合,这是不一样的

首先,“差异因子”只是将问题从查找100个分区转变为(在您的示例中)查找5个分区(然后乘以20)

下一步:如果bucket的数量是常量,您可以执行以下操作(伪代码):

如果桶的数量是动态的,你必须要聪明一点,但这种方法基本上是可行的。

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

首先,“差异因子”只是将问题从查找100个分区转变为(在您的示例中)查找5个分区(然后乘以20)

下一步:如果bucket的数量是常量,您可以执行以下操作(伪代码):


如果存储桶的数量是动态的,那么您必须更聪明一点,但这种方法基本上是可行的。

这看起来很适合缓存和动态编程

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

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

这看起来很适合缓存和动态编程

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

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

如果您的第一个分区远远超过100%,那么“求和到100%是什么意思。也不清楚你所说的差异因子是什么,因为它不是一个因子-你是说相邻桶之间的差异需要是+还是-差异“因子”?@Paul这些列加起来有100个重复。甚至数字也完全相同(100,20)。你确定这不是家庭作业,还是你是另一个问题海报的同事?@Harold,谢谢。我在添加行:(是的,这不是家庭作业。我确实读了另一个解决方案,但它看起来与我的问题太不一样了,我无法理解(例如,我不担心组合之间的距离。这个问题与投资组合内的资产分配有关。考虑到你的第一个投资组合远远超过100%,你说的总和是100%是什么意思?也不清楚你说的差异系数是什么,因为它不是一个系数-你是说相邻投资组合之间的差异需要是+还是-t差异“因子”?@Paul这些列加起来有100个重复。甚至数字都是完全相同的(100,20)。你确定这不是家庭作业还是你是另一个问题海报的同事?@Harold,谢谢。我正在添加行:(是的,这不是家庭作业。我确实读了另一个解决方案,但它看起来与我的问题太不一样了,我无法理解(例如,我不担心组合之间的距离。这个问题与资产组合中的资产分配有关。非常感谢。这比我想象的更有帮助,也不那么复杂。但是,看一下,桶的数量不是恒定的。如果我们考虑5桶,计算时间太高了。回到我的绘图板。如果我们考虑五桶,答案的数量也要高很多,事实上,它应该增长(大O项)。这是有帮助的,比我想象的要复杂得多。但是,看看它,桶的数量不是恒定的。如果我们考虑5桶,计算时间太高了。回到我的绘图板…如果我们考虑五桶,答案的数量也要高很多!它的存储桶数应该(以大O的形式)呈指数增长。。。