【发布时间】:2019-06-23 16:16:34
【问题描述】:
给定一个整数 n 和 k,我想创建一个包含所有大小为 k 的数组的数组,其中包含总和为 n 的非负整数。例如,如果 k=3 和 n=10 我会想要
[2,2,6]
[2,6,2]
[3,3,4]
[10,0,0]
etc....
请注意,顺序很重要,这可能会使这更容易。我知道总共应该有 n+k-1 个选择 k-1 个数组。
我最初的想法是只有 k 个嵌套循环,它会在每个元素上遍历 0 到 n,然后在末尾有一个 if 语句来检查总和是否为 n。不过,这似乎很笨拙且效率很低,我想知道是否有更好的方法,最好避免嵌套循环,因为我希望能够轻松调整 k。也许有一个相关的图书馆?我正在使用 Python。
这就是我对 k=4 和 n=16 的看法(糟糕):
a=0
list = []
for i in range(17):
for j in range(17-i):
for k in range(17-i-j):
for l in range(17-i-j-k):
if i+j+k+l==16:
list.append([i,j,k,l])
a += 1
【问题讨论】:
-
总和为给定值 $n$ 的整数列表称为 $n$ 的“整数分区”。搜索这个词可以获得更多的解决方案,例如 here.
标签: python math combinatorics