浮点值的子集总和不起作用

时间:2016-12-25 10:08:46

标签: python algorithm pandas numpy

我编写了用于计算子集求和的代码,其作用类似于整数值的值,但对于浮点值,它没有给出任何结果。

代码:

import numpy as np
array = np.array([15,1,4,6,3,10,4.2])
num = 8.2

def subsetsum(array,num):

    if num == 0 or num < 1:
        return None
    elif len(array) == 0:
        return None
    else:
        if array[0] == num:
            return [array[0]]
        else:
            with_v = subsetsum(array[1:],(num - array[0])) 
            if with_v:
                return [array[0]] + with_v
            else:
                return subsetsum(array[1:],num)

print('\nList of Values : ',array)
print('\nSum Desired : ',num)
print('\nValues that add up to sum : ',subsetsum(array,num))

整数值的输出

List of Values :  [15  1  4  6  3 10  4]

Sum Desired :  8

Values that add up to sum :  [1, 4, 3]

浮动值的输出

List of Values :  [ 15.    1.    4.    6.    3.   10.    4.2]

Sum Desired :  8.2

Values that add up to sum :  None

我如何使用浮点值?

2 个答案:

答案 0 :(得分:2)

您可以简单地使用np.isclose来计算浮点数比较。因此,要解决您的情况,请将:array[0] == num上的等式比较替换为:np.isclose(array[0], num)

同样,您可能希望在开始时进行类似的修改来修复:num == 0

答案 1 :(得分:0)

假设所有数字都大于1,我认为如果你可以消除数组中大于目标的任何元素,你可以加速算法。

我能够让代码对您的算法进行一些修改。

import numpy as np
z=[]
def subsetsum(array,tgt):
    if len(array)==1 and array[0]==tgt:
        return tgt
    elif len(array)<=1:
        return z
    else:
        k,s=[],0
        for i in array:
            s+=i
            k.append(i)
            if s==tgt:
                z.append([k])
                k=[]
        return subsetsum(array[1:],tgt)

array = np.array([15,1,4,6,3,10,4.2])
num=8.2
array.sort() #speed up
array=array[array<=num] #speed up
print subsetsum(array,num)