python中无限数字流的目标和

python中无限数字流的目标和,python,algorithm,stream,sum,logic,Python,Algorithm,Stream,Sum,Logic,我试图找到一个目标和,它可以从Python中的无限数字流中找到。数字为正(数字>0)、唯一且不确定。我相信答案是使用动态编程或堆,但不能完全理解逻辑 任何关于可能的数据结构或逻辑流的帮助都可以尝试 非常感谢你 e、 g 您可以使用集合来跟踪迭代中到目前为止给定数字的所有可能的和。对于每次迭代,将当前编号添加到集合中要添加到集合中的每个现有总和,并将当前编号本身添加到集合中。当目标和确实在集合中时返回True: def has_sum(nums, targetSum): sums = se

我试图找到一个目标和,它可以从Python中的无限数字流中找到。数字为正(数字>0)、唯一且不确定。我相信答案是使用动态编程或堆,但不能完全理解逻辑

任何关于可能的数据结构或逻辑流的帮助都可以尝试

非常感谢你

e、 g


您可以使用集合来跟踪迭代中到目前为止给定数字的所有可能的和。对于每次迭代,将当前编号添加到集合中要添加到集合中的每个现有总和,并将当前编号本身添加到集合中。当目标和确实在集合中时返回
True

def has_sum(nums, targetSum):
    sums = set()
    for i in nums:
        sums.update([s + i for s in sums if s + i <= targetSum])
        if i <= targetSum:
            sums.add(i)
        if targetSum in sums:
            return True
    return False
返回
True
(因为1+6+22=29),并且:

has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)
has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)

返回
False
(因为问题中的预期输出不正确)。

您可以使用集合来跟踪迭代中迄今为止给定数字的所有可能的和。对于每次迭代,将当前编号添加到集合中要添加到集合中的每个现有总和,并将当前编号本身添加到集合中。当目标和确实在集合中时返回
True

def has_sum(nums, targetSum):
    sums = set()
    for i in nums:
        sums.update([s + i for s in sums if s + i <= targetSum])
        if i <= targetSum:
            sums.add(i)
        if targetSum in sums:
            return True
    return False
返回
True
(因为1+6+22=29),并且:

has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)
has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)
返回
False
(因为问题中的预期输出不正确)。

@Pavis

我能想到的一个想法是使用紧图。您可以执行以下操作:

  • 将每个小于总和的数字元素作为节点添加到图形中
  • 每个新节点都连接到图中已存在的每个其他节点
  • 添加到图形后,使用宽度优先搜索从最低元素计算总和
  • 我认为这个过程很慢

    我能想到的一个想法是使用紧图。您可以执行以下操作:

  • 将每个小于总和的数字元素作为节点添加到图形中
  • 每个新节点都连接到图中已存在的每个其他节点
  • 添加到图形后,使用宽度优先搜索从最低元素计算总和

  • 我认为这个过程很慢,因为你可以递归地尝试满足目标和,不管给定序列中有没有第一个数字,直到给定序列中没有更多的数字,或者直到给定的目标和不再是正的(因为你在评论中提到所有给定的数字都是正的):

    返回
    True
    (因为1+6+22=29),并且:

    has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)
    
    has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)
    
    返回
    False
    (因为问题中的预期输出不正确)

    编辑:为了避免在每次调用中将输入序列减去第一项复制到
    rest
    ,从而影响性能,可以使用索引来改进上述代码:

    def has_sum(nums, targetSum, index=0):
        if index == len(nums) or targetSum <= 0:
            return False
        num = nums[index]
        return num == targetSum or has_sum(nums, targetSum - num, index + 1) or has_sum(nums, targetSum, index + 1)
    
    def具有_和(nums,targetSum,index=0):
    
    如果index==len(nums)或targetSum,您可以递归地尝试满足给定序列中有或没有第一个数字的目标和,直到给定序列中没有更多的数字,或者直到给定的目标和不再为正(因为您在注释中提到所有给定的数字都为正):

    返回
    True
    (因为1+6+22=29),并且:

    has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)
    
    has_sum([99, 85, 1, 3, 6, 72, 7, 9, 22], 27)
    
    返回
    False
    (因为问题中的预期输出不正确)

    编辑:为了避免在每次调用中将输入序列减去第一项复制到
    rest
    ,从而影响性能,可以使用索引来改进上述代码:

    def has_sum(nums, targetSum, index=0):
        if index == len(nums) or targetSum <= 0:
            return False
        num = nums[index]
        return num == targetSum or has_sum(nums, targetSum - num, index + 1) or has_sum(nums, targetSum, index + 1)
    
    def具有_和(nums,targetSum,index=0):
    
    如果index==len(nums)或targetSum,您确定您的意思是无限吗?我想你指的是一个数字列表。您好,是的,在连续数字流的意义上是无限的。我们不知道流的长度。你想让我们为你实现一个算法,从一个有限的列表中确定一组成员,添加后的结果是targetSum吗?到目前为止你尝试了什么?如果NUM是有限的(包含
    n
    元素),请尝试以下操作:-尝试所有
    n
    可能性,从列表中选择一个条目,查看其是否为
    targetSum
    -从列表中选择两个条目,查看其总和是否为
    targetSum
    ,如果未找到结果,请尝试使用3个条目。。。直到您尝试使用n个条目。看看模块
    itertools
    ,它有
    组合
    功能,这对你很有帮助。你的意思是
    不定
    (未定义/长度未知,未定义)或
    无限
    列表将无法放入内存,因为其中始终有另一个成员是你迄今为止无法访问的)Hi@gelonida,谢谢你可能的解决方案。我的意思是无限的,其中的列表将不适合记忆。如果能就如何处理这个问题提出一个逻辑,那就太好了。你确定你是指无限吗?我想你指的是一个数字列表。您好,是的,在连续数字流的意义上是无限的。我们不知道流的长度。你想让我们为你实现一个算法,从一个有限的列表中确定一组成员,添加后的结果是targetSum吗?到目前为止你尝试了什么?如果NUM是有限的(包含
    n
    元素),请尝试以下操作:-尝试所有
    n
    可能性,从列表中选择一个条目,查看其是否为
    targetSum
    -从列表中选择两个条目,查看其总和是否为
    targetSum
    ,如果未找到结果,请尝试使用3个条目。。。直到您尝试使用n个条目。看看模块
    itertools
    ,它有
    组合
    功能,这对你很有帮助。你的意思是
    不定
    (未定义/长度未知,未定义)或
    无限
    列表将无法放入内存,因为其中始终有另一个成员是你迄今为止无法访问的)Hi@gelonida,谢谢你可能的解决方案。我的意思是无限,列表中不会有