2016-11-16 3 views
0

Die algoritham ich verschiedene Kombinationen von Werten bin versucht, wird in der Lage meiner genaue oder ca. Ausgabe Summe des Wertes gebenAlgorithmus für ausschließen Kombinationen mit eindeutigem Wert mit PHP

I Bild für die detaillierte Erklärung beigefügt habe, habe ich erstellt Spaltensumme als Summe jedes Zeilenwerts und schließlich habe ich den gesamten Gesamtwert summiert, der gesamte Summenwert soll mein erwarteter Ausgabewert sein.

Also ich versuche, eine Kombination aus jeder Zeile Summe zu nehmen und Gesamtsummenwert

Mein Algorithmus i gesucht in Google unter

function extractList($array, &$list, $temp = array()) { 
    if (count($temp) > 0 && ! in_array($temp, $list)) 
     $list[] = $temp; 
    for($i = 0; $i < sizeof($array); $i ++) { 
     $copy = $array; 
     $elem = array_splice($copy, $i, 1); 
     if (sizeof($copy) > 0) { 
      $add = array_merge($temp, array($elem[0])); 
      sort($add); 
      extractList($copy, $list, $add); 
     } else { 
      $add = array_merge($temp, array($elem[0])); 
      sort($add); 
      if (! in_array($temp, $list)) { 
       $list[] = $add; 
      } 
     } 
    } 
} 

echo "<pre>"; 

$sum = 32 ; //SUM 
$array = array(5.14327,5.72355,5.91794,4.8209,8.69933,4.12977,4.12977,2.92791,2.36829,2.21819,1.33759,1.72278,1.72278,0.589,1.06405,0.6387,0.6387,1.68995,2.51669,3.97842,2.38058,2.17175,4.88264,5.84811,6.14215); 

$list = array(); 

# Extract All Unique Conbinations 
extractList($array, $list); 

#Filter By SUM = $sum 
$list = array_filter($list,function($var) use ($sum) { return(array_sum($var) == $sum);}); 

#Return Output 
print_r($list); 

Attached Image here

+0

Ihr Bild macht keinen großen Sinn, die grüne Spalte enthält keine Zeilensummen. – Walf

+0

Sie werden antworten? – Walf

Antwort

0

Sie müssen bekommen um zu entscheiden, wie Sie die ungefähre Gleichheit bestimmen. Ein Prozentsatz? Oder ein absoluter Betrag? Das brauchen Sie in Ihrer Filter-Lambda-Funktion.

// outside lambda 
$error = $sum * 5/100;// 5%, or 
$error = 0.02;// an absolute 
... 
// inside lambda 
return abs(array_sum($var) - $sum) <= $error; 
Verwandte Themen