我正在寻找一种巧妙的方法来做以下事情,但是大脑冻结了:
用户可以将类型添加(并随后删除)到购物篮。 对于每次添加或删除,我需要查看层次结构中是否存在可以建议的更高类型。最好的类型是优选的(注意它与倒数第二类型的价格相同,但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。
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());
});
});
答案 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;
});
答案 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/
这不能处理任何角落情况,所以我可能错过了一些东西。如果有帮助请告诉我