Indexi valorilor din array care fac suma

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
sterica
Mesaje:285

Indexi valorilor din array care fac suma

Salutare,

am un array cu urmatoarele numere:

Cod: Selectaţi tot

arr = [50, 100, 100, 100, 200, 200]
si o variabila, care poate contine numere intregi de la 50 pana 750 (750 este suma tuturor numerelor din array), iar valoarea sa fie divizibila cu 50

Cod: Selectaţi tot

number = 300
cum pot insuma numerele din array si sa returnez cheile numerelor implicate in calcul, ma intereseaza doar prima varianta care duce la egalitatea cu variabila 300

Multumesc!

MarPlo Mesaje:4343
Salut,
Care este rolul acelei variabile, ce trebuie sa faca (number=300) in acea ecuatie, in calcularea sumei?
In functie de ce anume se stabilesc cheile si suma?

sterica Mesaje:285
Variabila number stochează numărul introdus de user, numărul pe care îl introduce poate fi cuprins între 50 și 750
50 este minimul
750 este suma maxima a tuturor valorilor din array
de asemena numărul pe care îl introduce va fi divizibil cu 50

Sa presupunem ca userul introduce valoarea 400
Trebuie sa returnez cheile arrayului care formează suma de 400, cum ar fi: 100+100+200 sau 200+200.
Ma interesează doar o varianta, varianta pe care o găsește algoritmul prima

MarPlo Mesaje:4343
Inceardca codul urmator. La test va afisa un array cu indexi tuturor combinatiilor /permutarilor de valori din array ($arr) care fac acea suma ($sum).
Variabila $first_re contine indexi primei combinatii.

Cod: Selectaţi tot

/**
 * gets all possible permutations of $array
 * @param array $array
 * @param array $permutations
 * @return array
 */
function permutations($array, $permutations =[]) {
  if( !empty($array) ) {
    $result = [];

    for( $i = count($array) - 1; $i >= 0; --$i ) {
      $newItems = $array;
      $newPerms = $permutations;
      list($values) = array_splice($newItems, $i, 1);
      array_unshift($newPerms, $values);
      $result = array_merge($result, permutations($newItems, $newPerms));
    }
  }
  else $result = array($permutations);

  return $result;
}

/**
 * Returns all possible key combinations of $array with a sum equal $maxSum
 * @param array $array
 * @param integer $maxSum
 * @return array
 */
function combinations($array, $maxSum) {
  // get all permutations of the array keys
  $permutations = permutations(array_keys($array));
  $combinations =[];

  // loop all permutations
  foreach( $permutations as $keys ) {
    // create a container for each permutation to store calculation
    $c_keys =[];
    $c_sum =0;

    // now loop through the permutation keys
    foreach( $keys as $key ) {
      // if the addition is still between or equal $maxSum
      if( ($c_sum + $array[$key]) <= $maxSum ) {
        // increment the sum and add key to result
        $c_sum += $array[$key];
        $c_keys[] = $key;
      }
    }
    if($c_sum < $maxSum) continue;

    // to be sure each combination only exists once in the result
    // order the keys and use them as array index
    sort($c_keys);
    $combinations[join($c_keys)] = $c_keys;

//    if($c_sum == $maxSum) break; //Uncoment to return just first result
  }

  // remove the created key-index from array when finished
  return array_values($combinations);
}

$arr =[50, 100, 100, 100, 200, 200];
$sum = 400;
$keys = combinations($arr, $sum);
$first_re = $keys[0];  // keys of the first result

// Output array with results
echo '<pre>';
var_export($keys);

sterica Mesaje:285
Mulțumesc mult marplo, este ceea ce îmi trebuie

Subiecte similare