<?php
static
$values = array( 15.92, 53.27, 244.28, 388.46, 3.14, 2.92, 18.22, 4.03 ); static $expected = 297.55;
static $precision = 100; /* para não ter problemas com ponto flutuante */
$target = floor( $expected * $precision ); for( $i = 1; $i < pow( 2, $len ); $i++ ) { $soma = 0;
for( $j = 0; $j < $len; $j++ ) {
if( 1 << $j & $i ) {
$set[] = $j;
$soma += floor( $values[$j] * $precision ); }
}
if( $soma == $target ) {
// Estamos exibindo na tela apenas como demonstração. Se preferir pode armazenar.
foreach( $set as $pos ) echo "[$pos]{$values[$pos]} ";
echo " = $expected\n";
}
}
?>
PD9waHAKICAgc3RhdGljICR2YWx1ZXMgID0gYXJyYXkoIDE1LjkyLCA1My4yNywgMjQ0LjI4LCAzODguNDYsIDMuMTQsIDIuOTIsIDE4LjIyLCA0LjAzICk7CiAgIHN0YXRpYyAkZXhwZWN0ZWQgPSAyOTcuNTU7CiAgIHN0YXRpYyAkcHJlY2lzaW9uID0gMTAwOyAvKiBwYXJhIG7Do28gdGVyIHByb2JsZW1hcyBjb20gcG9udG8gZmx1dHVhbnRlICovCgogICAkdGFyZ2V0ID0gZmxvb3IoICRleHBlY3RlZCAqICRwcmVjaXNpb24gKTsKICAgJGxlbiA9IGNvdW50KCAkdmFsdWVzICk7CiAgIGZvciggJGkgPSAxOyAkaSA8IHBvdyggMiwgJGxlbiApOyAkaSsrICkgewogICAgICAkc29tYSA9IDA7CiAgICAgICRzZXQgPSBhcnJheSgpOwogICAgICBmb3IoICRqID0gMDsgJGogPCAkbGVuOyAkaisrICkgewogICAgICAgICBpZiggMSA8PCAkaiAmICRpICkgewogICAgICAgICAgICAkc2V0W10gPSAkajsKICAgICAgICAgICAgJHNvbWEgKz0gZmxvb3IoICR2YWx1ZXNbJGpdICogJHByZWNpc2lvbiApOwogICAgICAgICB9CiAgICAgIH0KICAgICAgaWYoICRzb21hID09ICR0YXJnZXQgKSB7CiAgICAgICAgIC8vIEVzdGFtb3MgZXhpYmluZG8gbmEgdGVsYSBhcGVuYXMgY29tbyBkZW1vbnN0cmHDp8Ojby4gU2UgcHJlZmVyaXIgcG9kZSBhcm1hemVuYXIuCiAgICAgICAgIGZvcmVhY2goICRzZXQgYXMgJHBvcyApIGVjaG8gIlskcG9zXXskdmFsdWVzWyRwb3NdfSAiOwogICAgICAgICBlY2hvICIgPSAkZXhwZWN0ZWRcbiI7CiAgICAgIH0KICAgfQo/Pg==