<script>
let X =
new
Array(2000005);
let Y =
new
Array(2000005);
for
(let i = 0; i < 2000005; i++)
{
X[i] = 0;
Y[i] = 0;
}
function
calcsubarray(a, x, n, c)
{
for
(let i = 0; i < (1 << n); i++)
{
let s = 0;
for
(let j = 0; j < n; j++)
if
((i & (1 << j)) == 1)
s += a[j + c];
x[i] = s;
}
}
function
solveSubsetSum(a,n,S)
{
calcsubarray(a, X, Math.floor(n / 2), 0);
calcsubarray(a, Y, n - Math.floor(n / 2), Math.floor(n / 2));
let size_X = 1 << Math.floor(n / 2);
let size_Y = 1 << (n - Math.floor(n / 2));
Y.sort(
function
(a,b){
return
a-b;});
let max = 0;
for
(let i = 0; i < size_X; i++)
{
if
(X[i] <= S)
{
let p = lower_bound(Y, S - X[i]);
if
(p == size_Y || Y[p] != (S - X[i]))
p--;
if
((Y[p] + X[i]) > max)
max = Y[p] + X[i];
}
}
return
max;
}
function
lower_bound(a,x)
{
let l = -1, r = a.length;
while
(l + 1 < r)
{
let m = (l + r) >>> 1;
if
(a[m] >= x)
r = m;
else
l = m;
}
return
r;
}
let a=[3, 34, 4, 12, 5, 2 ];
let n = a.length;
let S = 10;
document.write(
"Largest value smaller "
+
"than or equal to given "
+
"sum is "
+
solveSubsetSum(a, n, S)+
"<br>"
);
</script>