数组面试题-子集和问题

2016-09-20  本文已影响0人  _mio

题目描述


给定一个含有n个元素的整形数组,再给定一个和sum,求出数组中满足给定和的所有元素组合存在一个数组中。


解法之一:回溯法

分析:对于数组中任意一个元素,先将其放入结果集中,如果当前和不超出给定和,那就继续考察下一个元素,如果超出给定和,则舍弃当前元素。如此往复,直到找到所有可行解。

//给定一个含有n个元素的整形数组,再给定一个和sum,求出数组中满足给定和的所有元素组合

/**
 * arr : 目标数组
 * sum : 给定的和
 * res : 结果数组
 * c : 符合条件的数组子集
 * n : 数组长度
 * t : 当前子集存储的元素个数
 */
var arr = [5, 2, 3, 4, 11, 6, 7, 8, 9];
var res = [];
var c = [];
var sum = 10;

function fixedSum(arr, n, t, sum) {
    if (sum === 0) {
        res.push(c.slice(0));
    } else {
        if (t === n) {
            return;
        } else {
            c.push(arr[t]);
            if (sum - arr[t] >= 0) {
                fixedSum(arr, n, t + 1, sum - arr[t]);
            }
            c.pop();
            if (sum >= 0) {
                fixedSum(arr, n, t + 1, sum);
            }
        }
    }
}

fixedSum(arr, arr.length, 0, sum);
console.log(res);

示例代码输出结果为:[ [ 5, 2, 3 ], [ 2, 8 ], [ 3, 7 ], [ 4, 6 ] ]


解法参考:
http://www.cnblogs.com/graphics/archive/2011/07/14/2105195.html

上一篇下一篇

猜你喜欢

热点阅读