fork download
  1. <?php
  2. $dados = array('0.10','0.20','0.30','0.50',
  3. '3.00','3.30','4.00','5.00',
  4. '1.00','1.10','2.00','2.20');
  5.  
  6. function adicionaValorCombinacao($dados, $comb, $objetivo, &$resultados){
  7. if (count($comb) == count($dados)){
  8. return;
  9. }
  10.  
  11. foreach ($dados as $dado){
  12. if (!in_array($dado, $comb)){
  13. array_push($comb, $dado);
  14. $total = array_sum($comb);
  15. if ($total > $objetivo){
  16. array_pop($comb);
  17. break;
  18. }
  19.  
  20. $chave = str_split(implode("", $comb));
  21. sort($chave);
  22. $chave = implode("", $chave);
  23. if ($total === $objetivo && !array_key_exists($chave, $comb)){
  24. $resultados[$chave] = $comb;
  25. }
  26.  
  27. adicionaValorCombinacao($dados, $comb, $objetivo, $resultados);
  28. array_pop($comb);
  29. }
  30. }
  31. }
  32.  
  33. function combinacoesParaObjetivo($dados, $objetivo){
  34. $resultados = Array();
  35. for ($i = 0; $i < count($dados); ++$i){
  36. $combinacao = Array();
  37. adicionaValorCombinacao($dados, $combinacao, $objetivo, $resultados);
  38. $ultimo = array_pop($dados);
  39. array_unshift($dados, $ultimo);
  40. }
  41.  
  42. return $resultados;
  43. }
  44.  
  45. $dados = array_map(function($val){ return floatval($val); }, $dados);
  46. $combinacoes = combinacoesParaObjetivo($dados, 1.1);
  47. var_dump($combinacoes);
Success #stdin #stdout 0.02s 23640KB
stdin
Standard input is empty
stdout
array(2) {
  ["....00001235"]=>
  array(4) {
    [0]=>
    float(0.5)
    [1]=>
    float(0.3)
    [2]=>
    float(0.2)
    [3]=>
    float(0.1)
  }
  [".11"]=>
  array(1) {
    [0]=>
    float(1.1)
  }
}