【发布时间】:2018-04-19 02:24:32
【问题描述】:
我有一个数字列表(源集),有人取了部分或全部这些数字并将它们随机相加以形成一个较小的数字集(目标集)。我有源集和目标集,但我需要弄清楚使用了什么组合。难点:我不能保证源集中的所有数字都用于制作目标集,也不能保证目标集中的所有数字都来自源集。这是一个简单的例子:
- 源集 = 1,2,3,4,5
- 目标集 = 3,8
- 结果:
- ResultSet1: Sum([1,2])=3 Sum([3,5])=8 NotFound([]) NotUsed([4])
- ResultSet2: Sum([3])=3 Sum([1,2,5])=8 NotFound([]) NotUsed([4])
- ResultSet3: Sum([1,3,4])=8 NotFound([3]) NotUsed([2,5])
- 无效的答案:
- InvalidSet1:Sum([1,2])=3 Sum([3])=3 Sum([3,5])=8 NotFound([]) NotUsed:[4]
- 原因:源集中的每个数字只能用于在给定结果集中创建任何目标
- InvalidSet1:Sum([1,2])=3 Sum([3])=3 Sum([3,5])=8 NotFound([]) NotUsed:[4]
我找到了一些很好的例子,可以在给定单个目标值的情况下推导上述内容,但是我找不到使用目标值数组而不是单个值的方法(不幸的是,我的编码技能没有提高到任务)。我最好的开始是this question,代码如下(请注意,我删除了 s >= target 检查以容纳我的数据):
def subset_sum(numbers, target, partial=[]):
s = sum(partial)
# check if the partial sum is equals to target
if s == target:
print "sum(%s)=%s" % (partial, target)
#if s >= target:
# return # if we reach the number why bother to continue
for i in range(len(numbers)):
n = numbers[i]
remaining = numbers[i+1:]
subset_sum(remaining, target, partial + [n])
if __name__ == "__main__":
subset_sum([1,2,3,4,5],4)
这将输出:
sum([1, 3])=4
sum([4])=4
我已经做出了一些勇敢的尝试来添加第二层递归以支持目标数组,但我不会因为将失败放在这里而让自己尴尬。
我了解上述代码存在局限性,我愿意接受基于此代码或全新代码的解决方案,并以几乎任何逻辑格式输出。 Python 是首选,但我几乎可以接受任何事情(注意:java 给我带来了荨麻疹)。
【问题讨论】:
标签: python algorithm search combinations