Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 寻找解决问题的特定组合算法_Python 3.x_Pandas_Algorithm_Math - Fatal编程技术网

Python 3.x 寻找解决问题的特定组合算法

Python 3.x 寻找解决问题的特定组合算法,python-3.x,pandas,algorithm,math,Python 3.x,Pandas,Algorithm,Math,比如说,我有一个购买总额,我有一个csv文件,里面有一部分购买总额,另一部分没有。有没有一种方法可以搜索csv以找到构成该总数的一个或多个购买组合?假设购买总额为155美元,我的csv文件包含购买[5.00美元、40.00美元、7.25美元、100.00美元、10.00美元]。有没有一个算法可以告诉我,总购买量的组合是多少 编辑:您提供的解决方案仍然存在问题。当我将这个带有pandas的电子表格输入到您提供的代码片段中时,它只显示了一个解决方案,当有三个时,它等于110.04美元。这就像它在没有

比如说,我有一个购买总额,我有一个csv文件,里面有一部分购买总额,另一部分没有。有没有一种方法可以搜索csv以找到构成该总数的一个或多个购买组合?假设购买总额为155美元,我的csv文件包含购买[5.00美元、40.00美元、7.25美元、100.00美元、10.00美元]。有没有一个算法可以告诉我,总购买量的组合是多少

编辑:您提供的解决方案仍然存在问题。当我将这个带有pandas的电子表格输入到您提供的代码片段中时,它只显示了一个解决方案,当有三个时,它等于110.04美元。这就像它在没有找到最终解决方案的情况下提前停止。这是我从终端得到的输出-[57.25,15.87,13.67,23.25]。输出应为[10.24,37.49,58.21,4.1]和[64.8,45.24]以及[57.25,15.87,13.67,23.25]

    from collections import namedtuple
import pandas

df = pandas.read_csv('purchases.csv',parse_dates=["Date"])

from collections import namedtuple
values = df["Purchase"].to_list()
S = 110.04
Candidate = namedtuple('Candidate', ['sum', 'lastIndex', 'path'])
tuples = [Candidate(0, -1, [])]

while len(tuples):
  next = []
  for (sum, i, path) in tuples:
    # you may range from i + 1 if you don't want repetitions of the same purchase
    for j in range(i+1, len(values)):
      v = values[j]
      # you may check for strict equality if no purchase is free (0$)
      if v + sum <= S:
        next.append(Candidate(sum = v + sum, lastIndex = j, path = path + [v]))
        if v + sum == S :
          print(path + [v])

  tuples = next
从集合导入namedtuple
进口大熊猫
df=pandas.read_csv('purchases.csv',parse_dates=[“Date”])
从集合导入namedtuple
values=df[“采购”]。至_列表()
S=110.04
Candidate=namedtuple('Candidate',['sum','lastIndex','path']))
元组=[候选(0,-1,[])]
而len(元组):
下一步=[]
对于元组中的(sum,i,path):
#如果您不想重复同一次购买,您可以选择i+1
对于范围(i+1,len(值))内的j:
v=值[j]
#如果没有免费购买(0$),您可以检查是否严格平等
如果v+sumdp溶液:

S
成为你的目标总和

  • 构建所有1-2组合。保持总和小于或等于S的值。只要等于S,就输出它
  • 构建所有2个组合,重用以前的组合
  • 重复

对硬币更换问题稍加修改,使您只使用一次硬币将有效鉴于不同的组合可能会产生相同的结果,我担心您必须测试每个组合。@ROBOT夫人更新了有关元组的更多详细信息,如果我仍然不清楚,请毫不犹豫地告诉我。这是在评论中写的。如果希望从包含的lastIndex重复迭代(so范围(i,len(值)),如果不希望从排除的lastIndex重复迭代(so范围(i+1,len(值))@MRS_ROBOTTip。如果你
导入集合
,那么你可以使用
集合。namedtuple
创建一个元组,并为其字段命名,以清晰明了。你最初的问题是在这里使用整数,你添加了一些浮点数,因此浮点数之和实际上不等于S,但非常接近。使用abs(v+sum-S)抱歉@MRS_ROBOT我错误地替换了错误的if…请查找更新的代码和repl.it。希望这是最终的代码
from collections import namedtuple
values = [57.25,15.87,13.67,23.25,64.8,45.24,10.24,37.49,58.21,4.1]
S = 110.04
Candidate = namedtuple('Candidate', ['sum', 'lastIndex', 'path'])
tuples = [Candidate(0, -1, [])]

while len(tuples):
  next = []
  for (sum, i, path) in tuples:
    # you may range from i + 1 if you don't want repetitions of the same purchase
    for j in range(i + 1, len(values)):
      v = values[j]
      # you may check for strict equality if no purchase is free (0$)
      if v + sum <= S:
        next.append(Candidate(sum = v + sum, lastIndex = j, path = path + [v]))
        if abs(v + sum - S) <= 1e-2 :
          print(path + [v])
  tuples = next
[64.8, 45.24]
[57.25, 15.87, 13.67, 23.25]
[10.24, 37.49, 58.21, 4.1]