我正试图解决这个问题一个多月了。 我有一个数字列表和这些变量:
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
可以有数百个数字和变量 x
而 y
可以有很大的价值观。
此示例的几个组合:
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
...
我会很感激一些新想法,我没有留下任何东西:)
答案 0 :(得分:3)
这是一个想法:
1)对列表进行排序
2)使用x元素的数组A - 这些将成为索引
3)将A初始化为[0,1,2,...,x-1]
4)现在开始增加索引词典,例如首先增加最后一个,直到总和得到> y。然后将倒数第二个增加到最后,使最后一个为1 +第二个为最后一个
等等
Fisrt几次迭代:
排序数组:[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]
答:[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]
答:[0,1,2,4,9] - 解决方案
A:[0,1,2,4,10] - > y
答:[0,1,2,5,6]
答:[0,1,2,5,7] - 解决方案
等
答案 1 :(得分:1)
这是NP完全问题,请在以下网址找到最佳解决方案:
答案 2 :(得分:0)
对于基数为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()函数的其他基础