给我一个数组arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
和一个目标值trgt = 10
。我需要找到subarrays
的所有可能组合,以便每个子数组元素的总和将得出给定的目标值trgt
。我需要使用Python完成任务。我在here中找到了类似的讨论。但是,给定的解决方案仅返回一个可能的子数组,而不返回其他有效的子数组。指向获取所有此类子数组的任何帮助将非常有帮助。预先谢谢你。
答案 0 :(得分:0)
以下解决方案找到添加到目标编号的子集:
def subsetsum(array,num):
if num == 0 or num < 1:
return None
elif len(array) == 0:
return None
else:
if array[0] == num:
return [array[0]]
else:
with_v = subsetsum(array[1:],(num - array[0]))
if with_v:
return [array[0]] + with_v
else:
return subsetsum(array[1:],num)
答案 1 :(得分:0)
获取组合的首选库是itertools
:
import itertools as it
import numpy as np
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
trgt = 10
首先计算一个元组的最大长度,即使该元组包含可用的最小数字,该元组的总和也可能导致trgt
:
maxsize = np.argwhere(np.cumsum(sorted(arr))>trgt)[0][0]
然后从一个迭代到maxsize
,让itertools创建相应的组合并仅保存总计为trgt
的组合:
subsets = []
for size in range(1, maxsize+1):
subsets.extend([t for t in it.combinations(arr, size) if sum(t)==trgt])
print(subsets)
#[(10,), (1, 9), (2, 8), (3, 7), (4, 6), (1, 2, 7), (1, 3, 6), (1, 4, 5), (2, 3, 5), (1, 2, 3, 4)]
答案 2 :(得分:0)
由于需要生成所有解决方案,因此必须使用蛮力解决。一种方法是使用如下所示的位掩码
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = len(arr)
target = 10
res = []
for i in range(1<<n):
s = 0
subset = []
for j in range(n):
if i & (1<<(j)): # if this bit is set to 1
subset.append(arr[j])
if sum(subset) == target:
res.append(subset)
print(res) # [[1, 2, 3, 4], [2, 3, 5], [1, 4, 5], [1, 3, 6], [4, 6], [1, 2, 7], [3, 7], [2, 8], [1, 9], [10]]
答案 3 :(得分:0)
这是@harry在链接的SO网站上的功能:
def subset(array, num):
result = []
def find(arr, num, path=()):
if not arr:
return
if arr[0] == num:
result.append(path + (arr[0],))
else:
find(arr[1:], num - arr[0], path + (arr[0],))
find(arr[1:], num, path)
find(array, num)
return result
这是您的数据:
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
trgt = 10
以上功能应用于您的数据:
subset(arr, trgt)
#[(1, 2, 3, 4),
# (1, 2, 7),
# (1, 3, 6),
# (1, 4, 5),
# (1, 9),
# (2, 3, 5),
# (2, 8),
# (3, 7),
# (4, 6),
# (10,)]
所以我建议您跟随您的链接,支持并使用哈利的答案。