Hi,
I searched through the archives and found the following snippit of code
from Tim Converse from late 2000. This is great, but does anyone know
how I can adapt this so I can return all values from a multidimensional
array? I have an id number which corresponds to a record which I need
to revisit once I get all possible combinations (not just the max which
below gives us) and I do not want to lose the link between the id and
the number. For instance:
$number[0]['id']=5;
$number[0]['number']=500;
$number[1]['id']=7;
$number[1]['number']=500;
$number[2]['id']=23;
$number[2]['number']=750;
$number[3]['id']=3;
$number[3]['number']=1500;
$max is assigned the value 1350 in this example, so we know id 3 will be
eliminated off the bat.
What I need to get back are the combinations of ID's where their
corresponding number are less than or equal to value $max. So in this
instance I might get something like;
5
7
23
5&7
5&23
7&23
I have spent about 40 hours in the last three days on this problem alone
and I can honestly say I am stuck. You guys are my last hope. Please
help a desperate man!
Thanks,
Michael.
-~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~-
Tim's code:
function maximum_subset_sum ($max, $candidate_array) {
$working_array = array();
while ($next = each($candidate_array)) {
$candidate = $next['value'];
$sums_to_date = array_keys($working_array);
while ($marked_sum = each($sums_to_date)) {
$known_sum = $marked_sum['value'];
$possibly_new = $known_sum + $candidate;
if(($possibly_new <= $max) &&
!IsSet($working_array[$possibly_new])){
$working_array[$possibly_new] = $candidate;
}
}
if(($candidate <= $max) &&
!IsSet($working_array[$candidate])){
$working_array[$candidate] = $candidate;
}
}
$max_sum = max(array_keys($working_array));
$return_array = array($working_array[$max_sum]);
while ($max_sum != $working_array[$max_sum]) {
$max_sum = $max_sum - $working_array[$max_sum];
array_push($return_array, $working_array[$max_sum]);
}
return($return_array);
}
// example use
$best_sum = maximum_subset_sum(40, array(39,23,19,14,9,5,3,2,1));
print("Largest sum is " . array_pop($best_sum));
while ($value = array_pop($best_sum)) {
print(" + $value");
} // will print "Best sum is 23 + 14 + 3"
-~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~--~=**=~-
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php