Skip to content

Instantly share code, notes, and snippets.

@YanivHaramati
Created April 17, 2015 23:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YanivHaramati/9657def74165839cbbb1 to your computer and use it in GitHub Desktop.
Save YanivHaramati/9657def74165839cbbb1 to your computer and use it in GitHub Desktop.
find a subset that adds up to a number over a verrrrry long list
function ArrayAddition(arr, expectedSum) {
// get all subsets, and filter out subsets whose sum doesn't add up to expectedSum.
var sizeRange = range(arr.length);
for (var i = 0; i < sizeRange.length; i++){
var subs = subsets(arr, sizeRange[i]).filter(function(s){ return s.length > 0;});
for(var j = 0; j < subs.length; j++){
if (sum(subs[j]) === expectedSum) {
return subs[j];
}
}
}
}
// sum all numbers in an array
function sum(arr) {
return arr.reduce(function(p,c) {
return p+c;
}, 0);
}
function range(min, max) {
if (!max) {
max = min;
min = 1;
}
return Array.apply(null, Array(max)).map(function(_,i){ return i+min; });
}
// I stole this bit of magic from stack overflow.
// Quite clever.
var subsets = function(input, size){
var results = [], result, mask, total = Math.pow(2, input.length);
for(mask = 0; mask < total; mask++){
result = [];
var i = input.length - 1;
do{
if( (mask & (1 << i)) !== 0){
result.push(input[i]);
}
}while(i--);
if( result.length >= size){
results.push(result);
}
}
return results;
};
var numbers = [-6000.00,-3740.33,-3600.00,-3600.00,-2400.00,-2400.00,-2000.00,-848.61,-761.30,-712.20,-688.13,-585.66,-528.08,-501.05,-466.56,-452.59,-452.59,-343.52,-339.44,-282.90,-282.90,-282.87,-280.51,-239.51,-235.85,-233.98,-224.41,-200.42,-178.19,-172.10,-170.98,-169.86,-167.02,-165.69,-158.27,-150.86,-149.61,-145.87,-144.65,-141.24,-113.15,-110.81,-108.91,-101.51,-93.39,-83.90,-74.91,-72.93,-70.78,-70.40,-68.11,-67.67,-57.92,-37.19,-36.87,-32.94,-32.00,-28.60,-27.24,-17.49,-16.74,-15.90,-13.54,-9.87,-7.74,-5.52,-0.18,0.18,9.87,13.54,15.90,27.24,28.60,37.19,57.92,67.67,68.11,70.40,70.78,72.93,74.91,93.39,101.51,108.91,113.15,144.65,145.87,150.86,167.02,169.86,170.98,172.10,178.19,200.42,239.51,247.78,247.78,253.84,253.84,253.84,253.84,253.84,253.84,282.87,282.90,282.90,307.88,339.44,452.59,452.59,466.56,501.05,509.21,528.08,585.66,688.13,719.23,761.30,831.05,848.61,1168.95,1452.97,2400.00,2400.00,3600.00,3600.00,3740.33,6000.00,-113.15,-110.81,-108.91,-101.51,-93.39,-83.90,-74.91,-72.93,-70.78,-70.40,-68.11,-67.67,-57.92,-37.19,-36.87,-32.94,-32.00,-28.60,-27.24,-17.49,-16.74,-15.90,-13.54,-9.87,-7.74,-5.52,-0.18,0.18,9.87,13.54,15.90,27.24,28.60,37.19,57.92,67.67,68.11,70.40,70.78,72.93,74.91,93.39,101.51,108.91,113.15,144.65,145.87,150.86,167.02,169.86,170.98,172.10,178.19,200.42,239.51,247.78,247.78,253.84,253.84,253.84,253.84,253.84,253.84,282.87,282.90,282.90,307.88,339.44,452.59,452.59,466.56,501.05,509.21,528.08,585.66,688.13,719.23,761.30,831.05,848.61,1168.95,1452.97,2400.00,2400.00,3600.00,3600.00,3740.33,6000.00];
// var numbers = [1.0, 2.23, 3.45,4.85,5.02,6.00,7.98,8.0,9.0,10.00]
var expectedValue = 275.40;
//var expectedValue = 2.23+3.45+4.85+6;
console.log(ArrayAddition(numbers, expectedValue));
console.log(ArrayAddition(numbers, -1 * expectedValue));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment