我有一个这样的数组:
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是输入值
如何解决这个问题?
答案 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 => 111
和9 => 1001
。然后它循环遍历这个二进制字符串的每个字符,并检查它是0还是1,并将数组中的等价物添加到结果中。