|
...
|
...
|
@@ -551,6 +551,7 @@ Page({ |
|
|
|
let finalList = []; //最终用的优惠券组合
|
|
|
|
// 计算可叠加的组合
|
|
|
|
let closestSum = -Infinity; // 最接近或等于输入值的和
|
|
|
|
let descSum = 0;//满减金额之和
|
|
|
|
function backtrack(startIndex, currentCombination, currentSum,couponCount) {
|
|
|
|
// 如果当前和等于输入值,直接返回
|
|
|
|
if (currentSum == amount) {
|
|
...
|
...
|
@@ -568,14 +569,16 @@ Page({ |
|
|
|
const obj = validCoupons[i];
|
|
|
|
if (obj.accumulationShow == '1') { // 仅考虑可叠加的优惠券
|
|
|
|
if (currentSum*1 + obj.price*1 > amount) continue; // 如果当前和已经超过输入值,跳过
|
|
|
|
let kyNum = Math.floor(amount/parseFloat(obj.desc))
|
|
|
|
if (amount - obj.price*1 >= 0&&(!couponCount[obj.aid]||couponCount[obj.aid] < kyNum)) {
|
|
|
|
couponCount[obj.aid] = (couponCount[obj.aid] || 0) + 1; // 更新使用次数
|
|
|
|
currentCombination.push(obj); // 添加当前数字到组合
|
|
|
|
backtrack(i + 1, currentCombination, currentSum*1 + obj.price*1,couponCount); // 递归
|
|
|
|
currentCombination.pop(); // 回溯
|
|
|
|
couponCount[obj.aid]--; // 回溯时减少使用次数
|
|
|
|
}
|
|
|
|
descSum += obj.desc*1;
|
|
|
|
let remainingPrice = amount - descSum;//输入金额 - 总满减条件金额
|
|
|
|
let kyNum = Math.floor(remainingPrice/parseFloat(obj.desc))
|
|
|
|
if (amount - obj.price*1 >= 0&&(!couponCount[obj.aid]||couponCount[obj.aid] < kyNum) && kyNum>-1) {
|
|
|
|
couponCount[obj.aid] = (couponCount[obj.aid] || 0) + 1; // 更新使用次数
|
|
|
|
currentCombination.push(obj); // 添加当前数字到组合
|
|
|
|
backtrack(i + 1, currentCombination, currentSum*1 + obj.price*1,couponCount); // 递归
|
|
|
|
currentCombination.pop(); // 回溯
|
|
|
|
couponCount[obj.aid]--; // 回溯时减少使用次数
|
|
|
|
}
|
|
|
|
// 提前退出:如果当前和加上当前数字已经小于输入值,后续的数字也会更小
|
|
|
|
if (currentSum*1 + obj.price*1 < amount) break;
|
|
|
|
}
|
...
|
...
|
|