Python中的一种算法,它以一个带有浮点数的列表作为输入,找到可能的组合以达到目标值X,并将其作为列表返回

Python中的一种算法,它以一个带有浮点数的列表作为输入,找到可能的组合以达到目标值X,并将其作为列表返回,python,algorithm,Python,Algorithm,最近,我不得不填写一份非常重要的申请表。我不得不将几个值加在一起,结果是9004.00欧元。然而,我找不到一张写下我实际添加的值的纸。我只有我没有加上全部的总值 因此,我需要一个算法,该算法将浮点列表作为输入,并告诉我导致9004.00欧元的组合。我不是一名计算机科学家,所以我不知道是否有一种算法可以实现这一点,或者这是一项难以置信的任务(因为计算机将花费太长时间) 我正在寻找这样的函数: def findCombinations(values:list, target_value:float

最近,我不得不填写一份非常重要的申请表。我不得不将几个值加在一起,结果是9004.00欧元。然而,我找不到一张写下我实际添加的值的纸。我只有我没有加上全部的总值

因此,我需要一个算法,该算法将浮点列表作为输入,并告诉我导致9004.00欧元的组合。我不是一名计算机科学家,所以我不知道是否有一种算法可以实现这一点,或者这是一项难以置信的任务(因为计算机将花费太长时间)

我正在寻找这样的函数:

 def findCombinations(values:list, target_value:float) -> list):
      ...

像这样的算法存在吗?还是我必须自己找到一个?此外,是否合理可行?

可能的解决方案是:

  • 查找列表中元素的组合
  • 求每个长度不同的组合的和
  • 检查与目标相比的总和,这可能会为您提供多于1个组合
  • 示例代码为:

    from itertools import combinations as c
    l = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6]
    target = 3.3
    error_margin = 1e-4
    result = [seq for i in range(len(l), 0, -1) for seq in c(l, i) if abs(sum(seq) - target) <= error_margin]
    
    从itertools导入组合为c
    l=[1.1,2.2,3.3,4.4,5.5,6.6]
    目标=3.3
    误差_裕度=1e-4
    
    结果=[seq for i in range(len(l),0,-1)for seq in c(l,i)如果abs(sum(seq)-target)这里有一个生成器。我使用生成器是因为需要检查的输入值组合可能很多

    导入数学
    def powerset(s:List[int])->List[Tuple[int,…]:
    """
    严格地说,是功率集减去空集。
    动力集([1,2,3])-->(1,)(2,)(3,)(1,2)(1,3)(2,3)(1,2,3)。
    """
    返回(链自可数(范围(1,len(s)+1)内r的组合(s,r)))
    def FindCompositions(值:列表,目标值:浮点)->list):
    ps=功率集(值)#=2**len(值)-1项
    对于梳齿式ps:
    如果math.isclose(总和(梳),目标值):
    产量梳
    

    math.isclose有额外的参数,因此您可以调整比较的接近程度。

    列表有多长?不是不确定的,但它可能有30个元素。如果这是一般计算机强度可能达到的阈值,我可以将其减少到15个。您在编写docstring时犯了一个小错误。您的代码确实如此esn不会生成空元组。(它可能应该生成,否则名称“powerset”会产生误导。)哦,是的,我从powerset生成器中删除了冗余-在本例中,是空集,但忘记了更新docstring。如果我仍然可以编辑,我将添加一个注释。