fork(2) download
  1. <?php
  2. $total = 3.60; // valor total a ser testado
  3. echo "Para um total de $total:\n\n";
  4. $dados = array('0.10','0.20','0.30','0.50',
  5. '3.00','3.30','4.00','5.00',
  6. '1.00','1.10','2.00','2.20');
  7. foreach ($dados as $d)
  8. $dadosf[] = floatval($d); // cria array paralelo em float para facilitar
  9.  
  10. for ($i = 0; $i < sizeof($dados) - 1; $i++)
  11. $base[]=array($i); // cria os primeiros valores de base
  12.  
  13. for ($n = 2;$n < sizeof($dados); $n++) {
  14. foreach ($base as $i => $b1) { // soma os números de base
  15. $soma_base[$i]=0;
  16. foreach ($b1 as $b2) {
  17. $soma_base[$i] += $dadosf[$b2];
  18. }
  19. }
  20. $base2 = [];
  21. for ($b = 0; $b < sizeof($base); $b++) {
  22. $u = sizeof($base[$b])-1; // último elemento da base
  23. for ($p = $base[$b][$u] + 1; $p < sizeof($dados); $p++) {
  24. if (number_format($soma_base[$b] + $dadosf[$p], 3) == number_format($total, 3)) { // *** encontrou combinação da soma ***
  25. echo 'Combinação ' . ++$c . ': ';
  26. for ($d = 0; $d <= $u; $d++) {
  27. echo $dados[$base[$b][$d]] . ' + ';
  28. }
  29. echo $dados[$p] . ' = ' . $total . "\n";
  30. }
  31. $base2[] = $base[$b];
  32. $base2[sizeof($base2)-1][] = $p;
  33.  
  34. }
  35. }
  36. $base = $base2;
  37. }
  38.  
Success #stdin #stdout #stderr 0.03s 23568KB
stdin
Standard input is empty
stdout
Para um total de 3.6:

Combinação 1: 0.30 + 3.30 = 3.6
Combinação 2: 0.10 + 0.20 + 3.30 = 3.6
Combinação 3: 0.10 + 0.50 + 3.00 = 3.6
Combinação 4: 0.30 + 1.10 + 2.20 = 3.6
Combinação 5: 0.50 + 1.10 + 2.00 = 3.6
Combinação 6: 0.10 + 0.20 + 0.30 + 3.00 = 3.6
Combinação 7: 0.10 + 0.20 + 1.10 + 2.20 = 3.6
Combinação 8: 0.10 + 0.30 + 1.00 + 2.20 = 3.6
Combinação 9: 0.10 + 0.50 + 1.00 + 2.00 = 3.6
Combinação 10: 0.20 + 0.30 + 1.10 + 2.00 = 3.6
Combinação 11: 0.10 + 0.20 + 0.30 + 1.00 + 2.00 = 3.6
stderr
PHP Notice:  Undefined variable: c in /home/Ue0ax9/prog.php on line 25