我有一个16个数字池1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768。我有一个由16个数字组合而成的数字,其中1到16个加起来。例如,我有一个数字671,由1 + 2 + 4 + 8 + 16 + 128 + 512组成。我试图找出一种方法来获取我的16个数字池和我的总数,并确定使用哪个数字来计算总数。我将使用php来做这个我怎么试过搜索和数学远远不是我强大的西装我已经空出来试图找到解决这个问题的方法。
答案 0 :(得分:2)
这是典型的Subset sum problem
您可以使用简单的回溯来实现此目的
echo "<pre>";
$ns = array(1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768);
print_r(subsetSum($ns, 671 ));
输出
Array
(
[0] => 1 + 2 + 4 + 8 + 16 + 128 + 512
)
使用的功能
function subsetSum($arr, $val, $i = 0) {
$r = array();
while($i < count($arr)) {
$v = $arr[$i];
if($v == $val)
$r[] = $v;
if($v < $val)
foreach(subsetSum($arr, $val - $v, $i + 1) as $s)
$r[] = "$v + $s";
$i++;
}
return $r;
}