Python 组合算法挑战
我试图解决这个问题已经一个多月了。 我有一个数字列表和这些变量:Python 组合算法挑战,python,algorithm,combinations,Python,Algorithm,Combinations,我试图解决这个问题已经一个多月了。 我有一个数字列表和这些变量: 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 insi
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\u 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
...
我会很感激一些新的想法,我没有任何剩余:)对于以10为基数的输出数字,您只需向上计数一个变量,进行符号和,然后输出组合,如果符号和是例如10
代码:
def SignSum(X):
总和=0
String=str(X)
对于登录字符串:
总和+=int(符号)
回报金额
计数器=0
当计数器<10000时:
如果符号和(计数器)==10:
打印计数器
计数器+=1
当然,这也适用于具有修改的SignSum()函数的其他基数对于基数为10的输出数字,您只需向上计数一个变量,进行符号求和,然后输出组合(如果符号求和为10)
代码:
def SignSum(X):
总和=0
String=str(X)
对于登录字符串:
总和+=int(符号)
回报金额
计数器=0
当计数器<10000时:
如果符号和(计数器)==10:
打印计数器
计数器+=1
这当然也适用于具有修改的SignSum()函数的其他基
1) 对列表排序
2) 使用一个由x元素组成的数组-这些元素将成为索引
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]-溶液
等等。这里有一个想法:
1) 对列表排序
2) 使用一个由x元素组成的数组-这些元素将成为索引
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]-溶液
等等。这是NP完全问题,请在以下位置找到最佳解决方案:
这是NP完全问题,请在以下位置找到最佳解决方案:
对x
和y
的任何约束?给出明确的变量名称:)默认区域设置,显然x不能大于len(num_list),y必须是可能的,两者都是整数。Quonux你所说的清晰变量名称是什么意思?comb1,comb2,comb3中的y是这些数字的总和。但它不在列表_num中。comb1、comb2、comb3有重复计数的数字。我不太明白你的例子,你所说的“重复的数字必须被计算”是什么意思。检查:x
和y
上有任何约束吗?给出明确的变量名称:)默认区域设置,显然x不能大于len(num\u list),y必须是可能的,两者都是整数。Quonux你所说的清晰变量名称是什么意思?comb1,comb2,comb3中的y是这些数字的总和。但它不在列表_num中。comb1、comb2、comb3有重复计数的数字。我不太明白你的例子,你所说的“重复的数字必须被计算”是什么意思。请看:有趣的是,我会试试这个!然而,这并不是我想要的,但它的实现方式给了我一个想法。这个想法可以通过在我们到达y时进行分支来改进。意思是因为数组是排序的,你知道如果组合[0,1,2,3,6]大于或等于y,那么[0,1,2,3,7]也不起作用,所以直接跳过并直接尝试[0,1,2,4,5]。我说这不是我要找的,在尝试了这个之后,我只是抚摸砖墙。如果我能开发出这样的算法,计算时间就会成倍增长。有趣的是,我会试试这个!然而,这并不是我想要的,但它的实现方式给了我一个想法。这个想法可以通过在我们到达y时进行分支来改进。意思是因为数组是排序的,你知道如果组合[0,1,2,3,6]大于或等于y,那么[0,1,2,3,7]也不起作用,所以直接跳过并直接尝试[0,1,2,4,5]。我说这不是我要找的,在尝试了这个之后,我只是抚摸砖墙。如果我能开发出这样的算法,计算时间就会成倍增长。真有趣!谢谢你指路!!有趣!谢谢你的帮助
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