Thanks for your replies
I tried various ways. And was finally able to get it work :
<?php
$gcount = 0;
$set = array(1,2,4,8,16,32);
$needle = 33;
$sum = 0;
foreach ($set as $k => $v){
$sum += $v;
}
function evaluate_array($s, $sum){
$arr = array();
$arr[0] = 0;
foreach ($s as $k => $v) {
for( $i = 0; $i <= $sum; $i++){
if( isset($arr[$i]) ){
if( $arr[$i] != $v && $i + $v < $sum){
if( !isset($arr[$i + $v]) ){
$arr[$i + $v] = $v;
}
}
}
}
}
return $arr;
}
function solve($set, $sum, $needle){
$stack = evaluate_array($set, $sum);
while ($needle > 0){
echo $stack[$needle] . "<br/>";
$needle -= $stack[$needle];
}
}
function brute_force($set, $needle){
global $gcount;
$gcount++;
$sub = array(
'found' => false
, 'vals' => array()
);
$workset = $set;
foreach($workset as $k => $v){
if( $v == $needle){
$sub['found'] = true;
array_push($sub['vals'], $v);
return $sub;
}else{
array_shift($workset);
if( $needle - $v < 0){ return $sub; }
$r = brute_force($workset, $needle - $v);
if( $r['found'] ){
array_push($r['vals'], $v);
return $r;
}
}
}
return $sub;
}
function solve_bf($set, $needle){
global $gcount;
$sub = brute_force($set, $needle);
$sum = 0;
foreach($sub['vals'] as $k => $v){
echo $v . "<br/>";
$sum += $v;
}
echo "<br/>Sum: " . $sum;
echo "<br/># Recursions: " . $gcount;
}
//solve($set, $sum, $needle);
solve_bf($set, $needle);
?>
If $sum = 0, then no such subset exists.
(Ref. : https://github.com/burento/Subset-Sum-Problem/commit/ba549a8e67d6495fdaffafcd2e51833b7b6a57d4)