以更低的成本找到最佳组合

时间:2016-11-24 15:48:21

标签: javascript php laravel

我有一个这样的数组:

fee=[1 => 10,2=>18,4=>32,8=>60]

我希望得到如下结果:

7 -> 4+2+1 => 32+18+10
7=>60

9  -> 8+1 => 60+10
9=>70

这里7,9是输入值

如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您可以迭代费用组并获得可能的计数的整数值。保存该值并继续,直到选中所有组。

迭代的数组必须先按最低成本排序,然后再按较高的成本和较大的包先排序。



function getLowestCost(value, fee) {
    var result = { cost: 0 };

    result.rest = Object.keys(fee).sort(function (a, b) {
        return fee[a] / a - fee[b] / b || b - a;
    }).reduce(function (r, a) {
        result[a] = Math.floor(r / a);
        result.cost += result[a] * fee[a];
        return r % a;
    }, value);

    return result;
}

console.log(getLowestCost(7, { 1: 10, 2: 18, 4: 32, 8: 60 }));
console.log(getLowestCost(9, { 1: 10, 2: 18, 4: 32, 8: 60 }));

console.log(getLowestCost(7, { 1: 10, 2: 20, 4: 32, 8: 60 }));
console.log(getLowestCost(9, { 1: 10, 2: 20, 4: 32, 8: 60 }));

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:1)

这个有点棘手,但这有效并且可以扩展:

var arr = [10, 18, 32, 60];
var search = 7;
var result = 0;

for (var i = 0; i < (search >>> 0).toString(2).length; i++) {
    if ((search >>> 0).toString(2)[i] == "1") {
        result += arr[i];
    }
}
// result = 60

说明:(search >>> 0).toString(2)将搜索值(7)转换为二进制掩码。 7 => 1119 => 1001。然后它循环遍历这个二进制字符串的每个字符,并检查它是0还是1,并将数组中的等价物添加到结果中。

相关问题