我希望能够创建多个总和为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.但这看起来效率太低。
非常感谢。我希望我已经解释清楚了。
答案 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。