Выберите самую высокую комбинацию

-4

Я ищу аккуратный способ сделать следующее, но заморозить мозг:

Пользователь может добавить (и впоследствии удалить) тип в корзину покупок. Для каждого добавления или удаления мне нужно увидеть, есть ли в иерархии тип выше, который можно предложить вместо него. Самый высокий тип предпочтительнее (обратите внимание, что он имеет ту же цену, что и предпоследний тип, но 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, так как код его использует - карта и фильтр приветствуются) Я не опубликовал свои попытки recalc, так как я хочу избежать проблемы X/Y.

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());
});
});

спросил(а) 2014-07-10T20:16:00+04:00 5 лет, 7 месяцев назад
0
63

Это немного запутывает то, что вам нужно. Попробуй это:

//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/

ответил(а) 2014-07-10T21:01:00+04:00 5 лет, 7 месяцев назад
50

Проблема, как вы описали ее, кажется удивительно похожей на алгоритм смены монет.

Его можно заставить работать с довольно простой жадной петлей, идя куда-то вдоль этих линий:

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

Здесь ваша скрипка с этим обновлением: http://jsfiddle.net/DnRG9/1/

Это не касается каких-либо угловых случаев, поэтому возможно, что я что-то пропустил. Дайте мне знать, если это поможет

ответил(а) 2014-07-10T21:02:00+04:00 5 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема