选择最高的组合

时间:2014-07-10 17:17:00

标签: javascript jquery algorithm sorting

我正在寻找一种巧妙的方法来做以下事情,但是大脑冻结了:

用户可以将类型添加(并随后删除)到购物篮。 对于每次添加或删除,我需要查看层次结构中是否存在可以建议的更高类型。最好的类型是优选的(注意它与倒数第二类型的价格相同,但b6应优先于b5)

示例:

2 x type1      (100+100) -> 1 x type2
type1 + type3  (100+300) -> 1 x type4
type3 + type4  (300+400) -> 1 x type6 + 1 x type2

1 type6 + 1 type2 + 1 type1 -> 1 x type6 + 1 x type3

等等。

因此,如果总数为0,则只需添加点击的内容即可。 如果没有,请查看是否可以从顶部开始以更好的组合解析总加上新点击。如果用户拒绝建议,请忽略添加。

到目前为止

代码(自代码使用以来标记为jQuery - 欢迎使用map和filter) 我没有发布我对recalc的尝试,因为我想避开X/Y problem

jsFiddle

var types= { 
    b1: {price:100,quantity:0},
    b2: {price:200,quantity:0},
    b3: {price:300,quantity:0},
    b4: {price:400,quantity:0},
    b5: {price:500,quantity:0},
    b6: {price:500,quantity:0}
}
function getTotal() {
    var total = 0;
    $.each(types,function(typeId,type) {
        total+=type.quantity*type.price;
    });
    return total
}
$(function() {
    var cont = $("#container");
    $.each(types,function(typeId,type) {
        $('<button class="add" id="'+typeId+'add">Add to '+typeId+'<button><span id="'+typeId+'val">0</button><button class="remove" id="'+typeId+'remove">Remove from '+typeId+'</button><span id="'+typeId+'total">0</span><br/>').appendTo(cont);
    });
    $(".add").on("click",function() {
        var id = this.id.replace("add",""),type=types[id];
        type.quantity++;
        var subTotal = type.quantity*type.price;
        $("#"+id+"val").text(type.quantity);
        $("#"+id+"total").text(subTotal);
        $("#total").text(getTotal());
    });
    $(".remove").on("click",function() {
        var id = this.id.replace("remove",""),type=types[id];
        if (type.quantity>0) type.quantity--;
        var subTotal = type.quantity*type.price;
        $("#"+id+"val").text(type.quantity);
        $("#"+id+"total").text(subTotal);
        $("#total").text(getTotal());
    });
});

2 个答案:

答案 0 :(得分:2)

你所追求的有点令人困惑。试试这个:

//Sort the keys by price descending, and get the current total

   var remaining = getTotal(),
       keys = Object.keys(types).sort(function(a,b){
            return b.price > a.price ? -1 : 1;
       });


// Loop through the keys (sorted by price).
// Set quantity based on how many times the remainder goes into the price
// and update the remainder

    keys.forEach(
        function(k){
                var x = Math.floor(remaining/types[k].price);
                types[k].quantity = x;
                remaining -= x * types[k].price;
        });

http://jsfiddle.net/GC3mW/

答案 1 :(得分:1)

您所描述的问题听起来与coins-change algorithm非常相似。

可以使用一个相当简单的贪婪循环,沿着这些方向前进:

while(total > 0) {
     total = total - [get largest price less than total]
     [increment amount for above largest price]
}

这是您更新的小提琴:http://jsfiddle.net/DnRG9/1/

这不能处理任何角落情况,所以我可能错过了一些东西。如果有帮助请告诉我