2 回答
TA贡献1818条经验 获得超3个赞
我可能没有完全理解这个问题,但是,如果我理解了,这种完全不同的方法可以在几秒钟内解决N=8,实例。D=25
>>> sum(1 for x in gensums(4, 16))
455
似乎与您的代码返回的内容相匹配,并且
>>> sum(1 for x in gensums(8, 25))
346104
上次运行的示例x:
[9, 2, 3, 1, 1, 1, 1, 7]
这在尝试扩展部分解决方案的过程中使用递归来应用约束,因此可以提前切断许多无结果的路径。
注意:为了提高效率,它产生的列表通常是同一个列表对象,所以如果你想保存结果供以后使用,一定要复制每个结果。
编辑:替换为更快的版本,也许更清晰一些。
编辑:还有一个改进:添加nslots == 1允许断言的情况remaining并且nslots在函数入口处都是非零的。
def gensums(N, D):
def inner(sofar, nslots, remaining):
assert remaining and nslots
# If only 1 slot left, it's forced.
if nslots == 1:
sofar.append(remaining)
yield sofar
sofar.pop()
return
# If num slots equal to remaining, they must all be 1.
if nslots == remaining:
yield sofar + [1] * remaining
return
# What can we add next?
# What's left over must be enough to put at least 1 into
# each slot, so must have:
# remaining - candidate >= nslots - 1, or
# candidate <= remaining - nslots + 1
sofar.append(None)
for candidate in range(1, remaining - nslots + 2):
sofar[-1] = candidate
yield from inner(sofar, nslots - 1,
remaining - candidate)
sofar.pop()
return inner([], N, D)
TA贡献1842条经验 获得超21个赞
您可以使用排列并给出长度。
from itertools import permutations
d = 16
n = 4
for item in permutations(range(d), r=n):
if sum(item) == d:
print("this is a suiting fit!", item)
我想你可能不需要排列
from itertools import product
d = 16
n = 4
for item in product(range(d), repeat=n):
if sum(item) == d:
print("this is a suiting fit!", item)
添加回答
举报