【问题标题】:Combinations algorithm challenge组合算法挑战
【发布时间】:2013-03-30 07:22:27
【问题描述】:

我已经尝试解决这个问题一个多月了。 我有一个数字列表和这些变量:

list_num = [1, 1, 2, 3, 5, 6, 1, 1, 3, 4, 4]

#x is number of numbers in combination eg. if x = 5 combiantions will look like this [n,n,n,n,n], where n is possible member of list _num
x = 5
#y is a sum of numbers inside combination
y = 10

我需要生成这些数字的所有可能组合,因为 x 是组合数字的数量,而 y 是总和组合的数字,还必须考虑 list_num 内的重复次数。

我可以通过生成所有可能的组合并消除不是由我的规则确定的组合来做到这一点,但是这种方法很混乱,我不能将它用于大量数据。在我的原始程序中 list_num 可以有数百个数字和变量 xy 可以有很大的值。

这个例子的几个组合:

comb1 = [1,1,2,3,3], x = 5, y = 10
comb2 = [1,1,1,2,5], x = 5, y = 10
comb3 = [1,1,1,1,6], x = 5, y = 10

...

我会很感激一些新的想法,我没有任何剩余:)

【问题讨论】:

  • xy 有任何限制吗?
  • 给出明确的变量名:)
  • 默认语言环境,很明显 x 不能大于 len(num_list) 并且 y 必须是可能的两者都是整数。 Quonux 明确的变量名是什么意思?
  • comb1,comb2,comb3 中的y 是数字的总和。但它不在list_num 中。 comb1,comb2,comb3 有重复的被计数的数字。我不太理解您的示例以及“必须计算重复数字”的意思

标签: python algorithm combinations


【解决方案1】:

这是一个想法:

1) 对列表进行排序

2) 使用包含 x 个元素的数组 A - 这些将是索引

3) 将 A 初始化为 [0,1,2,...,x-1]

4) 现在开始按字典顺序增加索引,例如首先增加最后一个,直到总和> y。然后增加倒数第二个,使最后一个为1+倒数第二个

等等

前几次迭代:

排序数组:[1, 1, 1, 1, 2, 3, 3, 4, 4, 5, 6]

答:[0,1,2,3,4]

答:[0,1,2,3,5]

答:[0,1,2,3,6]

答:[0,1,2,3,7]

答:[0,1,2,3,8]

答:[0,1,2,3,9]

A: [0,1,2,3,10] - 解决方案

答:[0,1,2,4,5]

答:[0,1,2,4,6]

答:[0,1,2,4,7]

答:[0,1,2,4,8]

A:[0,1,2,4,9] - 解决方案

A: [0,1,2,4,10] - >y

答:[0,1,2,5,6]

A:[0,1,2,5,7] - 解决方案

等等

【讨论】:

  • 有趣我会试试这个!
  • 然而,这不是我想要的,但实现它的方式给了我一个想法。
  • 这个想法可以通过在我们到达 y 时立即扩展来改进。意思是由于数组已排序,您确实知道如果组合 [0, 1, 2, 3, 6] 大于或等于 y,则 [0, 1, 2, 3, 7] 也不起作用,并且所以直接跳过,直接尝试[0, 1, 2, 4, 5]。
  • 好吧,我说这不是我想要的,在尝试了这个之后,我只是抚摸了砖墙。如果即使我设法开发出以这种方式工作的算法,计算时间也会呈指数级增长。
【解决方案2】:

这是 NP 完全问题,请在以下位置找到最佳解决方案:

http://en.wikipedia.org/wiki/Subset_sum_problem

【讨论】:

  • 有趣!谢谢指点!!
【解决方案3】:

对于以 10 为底的输出数字,您可以只计算一个变量,进行符号和并输出组合,如果符号和为例如 10。

代码:

def SignSum(X):
    Sum = 0

    String = str(X)

    for Sign in String:
       Sum += int(Sign)

    return Sum

Counter = 0


while Counter < 10000:
   if SignSum(Counter) == 10:
      print Counter

   Counter += 1

这当然也适用于其他经过修改的 SignSum() 函数的基础

【讨论】: