![](/img/trans.png)
[英]How can I find which combinations of a set of numbers will sum to three numbers?
[英]Combinations for three numbers to sum up to 1000
我需要三个正整数的每个组合,总和为1000。
这是我的尝试,但我不确定这是否正确,因为我无法验证它。
def getSum():
l = []
for x in range(1, 999):
total = 1000-x
for y in range(1, 999):
total = total-y
if total>0:
l.append([x, y, total])
return l
print len(getSum())
我得到了28776种不同的组合。 那是对的吗?
由于1+998+1
和1+1+998
不是一回事,因此有一些令人难以置信的组合:
这一行可以生成所有:
[(i, 1000-i-k, k) for i in range(1,999) for k in range(1,1000-i)]
结果:
[...
(1, 4, 995),
(1, 3, 996),
(1, 2, 997),
(1, 1, 998),
(2, 997, 1),
(2, 996, 2),
...]
这个清单的长度是:
498501
不,这个数字不正确。 你的代码的问题是这一行:
total = total-y
在这里,您可以降低total
越走越用的每个值y
你尝试,它只是减去后从未重置价值x
。 要修复它,请创建一个新变量,例如total2
,并在内部循环中使用它。
total2 = total-y
这样,您就获得了498501
组合。 此外,只要total2 < 0
,就可以从内循环break
。
如果你只需要组合的数量 :注意有N-1
组合将两个数字相加到N
,例如对于N==4
: 1+3
2+2
3+1
(假设你考虑1+3
和3+1
不同)。 您可以将此扩展为三个数字的情况,将数字分为两部分两次。 这样,您只需要一个循环。 并且这可以进一步简化为O(1)公式。
例如,使用product
作为参考的天真方法:
>>> N = 100 # to make reference faster
>>> sum(1 for t in product(range(1, N+1), repeat=3) if sum(t)==N)
4851
>>> sum(N-1-i for i in range(1, N-1))
4851
>>> ((N-2)*(N-1))//2
4851
当然,也适用于N = 1000
(或更多,更大):
>>> N = 1000
>>> sum(N-1-i for i in range(1, N-1))
498501
>>> ((N-2)*(N-1))//2
498501
如果你对[1,1,998]和[1,998,1]的处理方式相同(没有唯一的整数):
def getSum():
l = []
for x in range(1, 999):
total = 1000-x
for y in range(1, 999):
total = total-y
if total>0:
z = [x, y, total]
z.sort()
if z not in l:
l.append(z)
return l
a = getSum()
print(len(a))
如果你想要3个唯一整数:
def getSum():
l = []
for x in range(1, 999):
total = 1000-x
for y in range(1, 999):
total = total-y
if total>0:
z = [x, y, total]
z.sort()
if (z not in l) and (not((len(set(z)) < len(z)))):
l.append(z)
return l
a = getSum()
print(len(a))
否则你的代码(在我看来)是好的。 我还没检查你的答案......
编辑:我用残酷的力量检查了它。 如果您对(1,1,998)和(998,1,1)的处理方式不同,那么正确的答案实际上是498501。 目前我不知道为什么......
尝试这个:
def getSum():
l = []
for x in range(1, 6):
for y in range(1, 6):
total = 6-(y+x)
if total>0:
s = set([x, y, total])
if s not in l:
l.append(s)
print(x, y, total)
return l
print (len(getSum()))
这是我的算法,虽然有更好的方法。 在这种情况下,我编写了6号代码并打印了所有组合以显示它是如何工作的。 您可以在此代码中设置1000或任何数字而不是6(在3位置)并忽略print()行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.