繁体   English   中英

给定总价格限制,生成产品组合

[英]Generate combination of products given a total price limit

我有一个产品ID数组,以及2个数组,其中键和价格分别为产品ID和值。

我希望在给定的总限价下拥有所有独特的产品组合:

  • 一个产品可以组合多次,除非将其标记为唯一
  • 组合应按产品ID排序
  • 有效的组合是我们无法添加产品的组合

样品:

products = [1, 2, 3];

productPrices = {1:10, 2:15, 3:10};

productUnique = {1:true, 2:false, 3:false};

limitPrice = 40;

expected result = [[1,2,2],[1,2,3],[1,3,3,3],[2,2,3],[2,3,3],[3,3,3,3]];

如果可能,如何在javascript中获取此结果? 谢谢您的帮助。

我建议您使用另一种格式的输入,因此它是一个对象数组,其中每个对象都有一个idpriceunique属性。

然后,使用该对象数组和限价,使用递归在每个递归级别上选择要添加到一系列产品中的产品,直到不能添加任何产品为止。 那时,将选定的产品列表添加到结果数组。

选择产品时,请确定在下一递归级别中仍可以选择哪些产品:选择唯一产品时,请勿将其作为选择可能性传递给下一级别。

为避免重复,一旦不再从中选择产品,就不要在更高的递归级别上使用它; 因此,当决定不再选择同一产品时,递归地传递较短的产品列表。 当最便宜,仍然可用的产品比仍然可用的数量更昂贵时,递归结束。

这是一个片段:

 function intoOne(products, productPrices, productUnique) { return products.map( (id) => ({ id, price: productPrices[id], unique: productUnique[id] })); } function combinations(products, limitPrice) { const results = []; function recurse(sel, products, minPrice, maxPrice) { products = products.filter(p => p.price <= maxPrice); if (!products.length && minPrice > maxPrice) return results.push(sel); products.forEach( (p, i) => { recurse(sel.concat(p.id), products.slice(i+p.unique), minPrice, maxPrice-p.price); minPrice = Math.min(minPrice, p.price); }); } recurse([], products, limitPrice, limitPrice); return results; } var products = [1, 2, 3], productPrices = {1:10, 2:15, 3:10}, productUnique = {1:true, 2:false, 3:false}, limitPrice = 40; // Combine product characteristics in more suitable structure products = intoOne(products, productPrices, productUnique); // Call main algorithm var result = combinations(products, limitPrice); console.log(JSON.stringify(result)); 

您可以采取迭代和递归的方法,方法是检查具有更改的索引或临时项的同一函数的下一次调用的总和,长度和唯一参数。

如果总和小于限制,则将临时结果添加到结果集中。

 function iter(index, temp) { var product = products[index], sum = temp.reduce((s, k) => s + prices[k], 0); if (sum + prices[product] > limit) { result.push(temp); return; } if (!unique[product] || temp[temp.length - 1] !== product) { iter(index, temp.concat(product)); } if (index + 1 < products.length) { iter(index + 1, temp); } } var products = [1, 2, 3], prices = { 1: 10, 2: 15, 3: 10 }, unique = { 1: true, 2: false, 3: false }, limit = 40, result = []; iter(0, []); console.log(JSON.stringify(result)); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM