2016-12-25 12 views
2

Ich habe Code für die Berechnung der Teilmenge Summe geschrieben, die wie ein Charme für ganzzahlige Werte funktioniert, aber für Float-Werte gibt es kein Ergebnis.Summe der Subsets für Float-Werte funktioniert nicht

Code:

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)) 

Ausgang für Integer-Werte

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

Sum Desired : 8 

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

Ausgang für Float-Werte

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

Sum Desired : 8.2 

Values that add up to sum : None 

Wie kann ich mit Float-Werten arbeiten?

+1

Die kurze Antwort ist, können Sie nicht, ohne zusätzliche Arbeit, weil dezimale Fließkomma-Literale Gleitkommazahlen nicht genau darstellen. Sie können versuchen, https://docs.python.org/3.6/library/decimal.html, die auch einige der Probleme berührt – pvg

+0

Könnten Sie angeben, welche zusätzliche Arbeit ich tun muss, um meine Lösung zu erreichen? –

+0

Was ist der erwartete O/P für den Float-Fall? – Divakar

Antwort

2

Nun können Sie einfach np.isclose verwenden, um Floating-Pt-Zahl-Vergleiche zu berücksichtigen. Also, um Ihren Fall zu lösen, ersetzen Sie den Gleichheitsvergleich um: array[0] == num mit: np.isclose(array[0], num).

In ähnlicher Weise möchten Sie möglicherweise eine ähnliche Bearbeitung am Anfang zu beheben: num == 0.

+0

Es funktioniert, aber die Ausgabe ist [1.0, 3.0, 4.2000000000002]. Ich brauche [1.0, 3.0, 4.2]. Wie erreiche ich das? –

+0

@MukeshKumarMishra, das ist nur ein Formatierungsproblem. – pvg

+0

@MukeshKumarMishra Das '4.2000000000002' ist genau das letzte Element Ihrer Eingabe. Um alle 16 Dezimalstellen anzuzeigen, legen Sie Folgendes fest: 'np.set_printoptions (precision = 16)' und drucken Sie dann Ihr Eingabearray. Sie würden sehen, dass das letzte Element '4.2000000000002' ist. Hoffnung, die Sinn macht. Wenn Sie ein Array als o/p erhalten wollen, tun Sie einfach: 'np.array (subsetsum (array, num))'. – Divakar

0

Angenommen, alle Zahlen sind größer als eins, ich denke, Sie können den Algorithmus beschleunigen, wenn Sie Elemente im Array größer als das Ziel eliminieren können.

Ich konnte den Code mit einigen Änderungen an Ihrem Algorithmus arbeiten.

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)