如何使用javascript将数字划分为数组中包含的特定值

时间:2016-04-12 14:21:15

标签: javascript jquery arrays

2我有以下数字和以下数字:

var array= [0.5, 1, 2, 3, 5, 10, 15, 20, 30, 40, 50, 100, 150, 250, 500];
var number = 1845;

"期望的结果" - > [500,500,500,250,50,40,5]

我需要找到一种方法来提出上面数组中包含的数字的最佳组合,以便它们的添加创建给定的数字。代码必须以这种方式工作,因为可接受的数字只是数组中的数字。因此,我需要返回500,500,500,250,50,40,5而不是1845年。

这是我的代码,但它没有像我期望的那样工作。

array = array.reverse();
var values = new Array();
var sts = $.inArray(number, array);
if (sts != -1){
    return number;
} else {
    for (k=0; k<array.length; k++){
        if ((number - array[k]) > 0){
            values.push(array[k]);
            number = number - array[k];
        }
    }
    return values.toString();
}

3 个答案:

答案 0 :(得分:1)

此提议迭代给定项的所有可能组合,并使用一些短路来减少迭代/递归。

如果右侧(潜在结果集)的总和大于所需总和,并且所有项目(左侧和右侧)的总和小于所需总和,则停止。

function getParts(array, sum) {
    function add(a, b) { return a + b; }

    function iter(left, right) {
        var sumRight = right.reduce(add, 0);
        left = left.slice();
        if (sumRight >= sum) {
            sumRight === sum && result.push(right);
            return;
        }
        if (!left.length || left.reduce(add, 0) + sumRight < sum) {
            return;
        }
        iter(left, right.concat(left.pop()));
        iter(left, right.concat([]));
    }

    var result = [];
    iter(array, []);
    result.sort(function (a, b) { return a.length - b.length; });
    return result;
}

function print(o) {
    document.write('<pre>length: ' + o.length + ' ' + JSON.stringify(o, 0, 4) + '</pre>');
}

print(getParts([0.5, 1, 2, 3, 5, 10, 15, 20, 30, 40, 50, 100, 150, 250], 5000));
print(getParts([0.5, 1, 2, 3, 5, 10, 15, 20, 30, 40, 50, 100, 150, 250], 495));

答案 1 :(得分:0)

这些问题背后的想法是,您将希望以最智能的方式检查每个可能的解决方案。为了解决这个问题,你需要学习A* pathfinding。基本上你告诉计算机哪些数据最好在列表中选择,然后检查这是否是答案。如果答案不是,那么将费用计算到下一个答案并重复。

这些问题一直存在于我出生之前。 Getting to all 50 state capitols是其中一种类型的问题。

它的长短,是你需要递归地遍历每个解决方案,直到找到匹配的解决方案。最糟糕的情况是 O(2 ^ n-1)。最好的情况是 O(1)

实施A *路径查找算法或其他类似类型的成本/收益算法将使您更快地到达目的地。但是你需要学习如何通过JavaScript实现它们。

答案 2 :(得分:0)

我解决了。这是答案。

String somePreferenceKey_cfg =
    GetterUtil.getString(portletPreferences.getValue("salesMin", "default_value"));