Get the sum of array items that are equal to the target (Subset sum)

后端 未结 1 2028
遇见更好的自我
遇见更好的自我 2021-01-05 06:33

I need to get the sum of array items that are equal to the target. If the sum of array item will not equal to the target I would like to get the highest sum that is less tha

相关标签:
1条回答
  • 2021-01-05 07:20

    Very similar solution to yours, a bit unclear if it's helpful:

    numbers = [4, 6, 8, 12, 4, 6, 6, 12, 4, 4];
    
    var result = createSubsets(numbers, 12);
    
    console.log('Result', JSON.stringify(result));
    
    function createSubsets(numbers, target) {
        // filter out all items larger than target
        numbers = numbers.filter(function (value) {
            return value <= target;
        });
    
        // sort from largest to smallest
        numbers.sort(function (a, b) {
            return b - a;
        });
    
        // array with all the subsets
        var result = [];
    
        while (numbers.length > 0) {
            var i;
            var sum = 0;
            var addedIndices = [];
    
            // go from the largest to the smallest number and
            // add as many of them as long as the sum isn't above target
            for (i = 0; i < numbers.length; i++) {
                if (sum + numbers[i] <= target) {
                    sum += numbers[i];
                    addedIndices.push(i);
                }
            }
    
            // remove the items we summed up from the numbers array, and store the items to result
            // since we're going to splice the numbers array several times we start with the largest index
            // and go to the smallest to not affect index position with splice.
            var subset = [];
            for (i = addedIndices.length - 1; i >= 0; i--) {
                subset.unshift(numbers[addedIndices[i]]);
                numbers.splice(addedIndices[i], 1);
            }
            result.push(subset);
        }
    
        return result;
    }
    

    Produces array:

    [12],[12],[8,4],[6,6],[6,4],[4,4]
    

    There's no limit regarding the subset length. If you add one more 4 to the numbers array you will get result:

    [12],[12],[8,4],[6,6],[6,4],[4,4,4]
    

    JSFiddle: http://jsfiddle.net/kUELD/

    0 讨论(0)
提交回复
热议问题