我在Oezis找到了这个好的旧算法PHP: find two or more numbers from a list of numbers that add up towards a given amount
效果很好,但要使用它我需要修改它,如果可能的话。 现在我输入普通数字并接收可能组合的新数组。
相反,我需要用键输入数字,并用可能的组合保存键。
提前感谢您的想法。
BR mielech
现在:
// Inputs OLD - no keys
$n = array(11, 18, 24, 24, 10, 9, 2);
// RESULT OLD - new array with no keys (no association to old indexes)
$ret = array(0 => 11,1 => 18,2 => 24,3 => 9);
目标:
// Inputs NEW - with keys to be preserved with the result
$n = array('21400'=>11, '10800'=>18, '91380'=>24, '91380'=>24, '21600'=>10, '70600'=>9, '71561'=>2);
// RESULT NEW - new array with old keys (associated with old keys)
$ret = array('21400'=>11, '10800'=>18, '91380'=>24, '70600'=>9);
算法 - Oezis的PHP: find two or more numbers from a list of numbers that add up towards a given amount
function array_sum_parts($n,$t,$all=false){
$count_n = count($n); // how much fields are in that array?
$count = pow(2,$count_n); // we need to do 2^fields calculations to test all possibilities
# now i want to look at every number from 1 to $count, where the number is representing
# the array and add up all array-elements which are at positions where my actual number
# has a 1-bit
# EXAMPLE:
# $i = 1 in binary mode 1 = 01 i'll use ony the first array-element
for($i=1;$i<=$count;$i++){ // start calculating all possibilities
$total=0; // sum of this try
$anzahl=0; // counter for 1-bits in this try
$k = $i; // store $i to another variable which can be changed during the loop
for($j=0;$j<$count_n;$j++){ // loop trough array-elemnts
$total+=($k%2)*$n[$j]; // add up if the corresponding bit of $i is 1
$anzahl+=($k%2); // add up the number of 1-bits
$k=$k>>1; //bit-shift to the left for looking at the next bit in the next loop
}
if($total==$t){
$loesung[$i] = $anzahl; // if sum of this try is the sum we are looking for, save this to an array (whith the number of 1-bits for sorting)
if(!$all){
break; // if we're not looking for all solutions, make a break because the first one was found
}
}
}
asort($loesung); // sort all solutions by the amount of numbers used
// formating the solutions to getting back the original array-keys (which shoud be the return-value)
foreach($loesung as $val=>$anzahl){
$bit = strrev(decbin($val));
$total=0;
$ret_this = array();
for($j=0;$j<=strlen($bit);$j++){
if($bit[$j]=='1'){
$ret_this[] = $j;
}
}
$ret[]=$ret_this;
}
return $ret;
}
// Target
$t=62;