鱼C论坛

 找回密码
 立即注册
查看: 2008|回复: 5

[已解决]有没有什么办法可以让一串数中的任意几项加和等于指定数

[复制链接]
发表于 2023-5-12 11:36:13 | 显示全部楼层 |阅读模式
20鱼币
如题。给定了一串数,我需要将一串无序的数导入,然后给定指定数,当数据加和等于给定数时,返回加和的数据。 数据加和.jpg
最佳答案
2023-5-12 11:36:14
这是一个经典的问题,也叫“子集和问题”。可以使用回溯法来解决这个问题。

具体来说,每次递归调用时,我们考虑两种情况:将当前数字加入结果列表(即路径),或者不将其加入。然后逐步枚举所有情况,直到找到了一个和等于给定数的序列。

下面是一个使用回溯法解决子集和问题的示例代码(假设要求的总和为target_sum,数字序列为nums):
def find_sum(nums, target_sum):
    result = []
    current_path = []

    def backtrack(start, current_sum):
        if current_sum == target_sum:   # 如果当前和等于目标和,添加当前路径至结果列表中
            result.append(current_path[:])
            return

        for i in range(start, len(nums)):
            num = nums[i]
            if current_sum + num > target_sum:   # 如果当前和加上当前数字已超过目标和,则不继续向下搜索
                continue
            current_path.append(num)    # 尝试将当前数字加入当前路径
            backtrack(i + 1, current_sum + num)   # 继续向下搜索
            current_path.pop()    # 回溯到上一层

    backtrack(0, 0)   # 从第0个数字开始搜索

    return result   # 返回满足条件的路径列表
这个函数会返回一个列表,其中包含所有和等于目标和的组合。例如,如果nums=[2, 5, 3, 1, 4],target_sum=7,则会返回[[2, 5], [3, 4]].

最佳答案

查看完整内容

这是一个经典的问题,也叫“子集和问题”。可以使用回溯法来解决这个问题。 具体来说,每次递归调用时,我们考虑两种情况:将当前数字加入结果列表(即路径),或者不将其加入。然后逐步枚举所有情况,直到找到了一个和等于给定数的序列。 下面是一个使用回溯法解决子集和问题的示例代码(假设要求的总和为target_sum,数字序列为nums): 这个函数会返回一个列表,其中包含所有和等于目标和的组合。例如,如果nums=[2, 5 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-12 11:36:14 | 显示全部楼层    本楼为最佳答案   
这是一个经典的问题,也叫“子集和问题”。可以使用回溯法来解决这个问题。

具体来说,每次递归调用时,我们考虑两种情况:将当前数字加入结果列表(即路径),或者不将其加入。然后逐步枚举所有情况,直到找到了一个和等于给定数的序列。

下面是一个使用回溯法解决子集和问题的示例代码(假设要求的总和为target_sum,数字序列为nums):
def find_sum(nums, target_sum):
    result = []
    current_path = []

    def backtrack(start, current_sum):
        if current_sum == target_sum:   # 如果当前和等于目标和,添加当前路径至结果列表中
            result.append(current_path[:])
            return

        for i in range(start, len(nums)):
            num = nums[i]
            if current_sum + num > target_sum:   # 如果当前和加上当前数字已超过目标和,则不继续向下搜索
                continue
            current_path.append(num)    # 尝试将当前数字加入当前路径
            backtrack(i + 1, current_sum + num)   # 继续向下搜索
            current_path.pop()    # 回溯到上一层

    backtrack(0, 0)   # 从第0个数字开始搜索

    return result   # 返回满足条件的路径列表
这个函数会返回一个列表,其中包含所有和等于目标和的组合。例如,如果nums=[2, 5, 3, 1, 4],target_sum=7,则会返回[[2, 5], [3, 4]].
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-12 11:37:02 | 显示全部楼层
您可以使用回溯算法来解决此问题。具体来说,您可以编写一个函数,该函数将输入列表以及目标和作为参数,并尝试找到一个子集,其总和等于目标和。以下是一个可能的实现:
def find_subset(nums, target):    def backtrack(start, target, path):        if target == 0:            return path        if target < 0:            return None        for i in range(start, len(nums)):            result = backtrack(i+1, target-nums[ i], path+[nums[ i]])            if result:                return result        return None        return backtrack(0, target, [])
在这个实现中, backtrack  函数采用三个参数:起始索引  start ,目标和  target  和当前路径  path 。该函数首先检查当前的目标和是否为零,如果是,则返回当前路径,表示找到了一个子集。如果目标和小于零,则返回  None ,表示当前路径不是解决方案。否则,该函数尝试从起始索引开始迭代列表中的每个元素。对于每个元素,它递归调用  backtrack  函数,将其索引加一,并将目标和减去该元素的值。如果递归调用返回一个解决方案,则  backtrack  函数返回该解决方案。如果没有找到解决方案,则返回  None 。

您可以将上述函数用于解决您的问题,如下所示:
nums = [3, 1, 4, 2, 5, 8]target = 9result = find_subset(nums, target)print(result)
在这个示例中,输入列表是  [3, 1, 4, 2, 5, 8] ,目标和是  9 。运行  find_subset  函数后,它将返回一个子集,其总和等于  9 。在这种情况下,可能的子集是  [3, 1, 5]  或  [4, 5] ,因为它们的总和都是  9 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-12 11:53:49 | 显示全部楼层
isdkz 发表于 2023-5-12 11:37
您可以使用回溯算法来解决此问题。具体来说,您可以编写一个函数,该函数将输入列表以及目标和作为参数,并 ...

但是我的数据是浮点数,如果用Decimal来运算的话应该在哪个地方添加?而且这个只能返回一个值,如果想返回所有值的数组应该怎么做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-13 15:29:10 | 显示全部楼层
陶远航 发表于 2023-5-12 11:36
这是一个经典的问题,也叫“子集和问题”。可以使用回溯法来解决这个问题。

具体来说,每次递归调用时, ...

你好,这个怎么修改才能进行准确的浮点数运算呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-13 15:31:29 | 显示全部楼层
zc4555666 发表于 2023-5-13 15:29
你好,这个怎么修改才能进行准确的浮点数运算呢

当涉及浮点数时,应该使用一个小误差范围(例如1e-9)来检查当前和是否接近于目标和,而不是直接比较它们是否相等。例如,可以将以下行:
if current_sum == target_sum:
替换为:
if abs(current_sum - target_sum) < 1e-9:
此外,在计算当前和时,也应该使用浮点数,如下所示:
if abs(current_sum + num - target_sum) < 1e-9:   # 如果当前和加上当前数字已接近目标和
这样修改后,函数应该能够进行准确的浮点数运算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 02:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表