在日常公司财务报销或电商财务对账中,我们经常遇到这样一个头疼的场景:手里有一堆不同面额的发票(例如:85元、120元、230元、45元、150元),而公司规定的报销额度是 350 元。如果靠人工去一张张穷举拼凑,既费时又容易出错。

在算法中,这属于典型的 “子集和问题(Subset Sum Problem)”。我们可以利用 JavaScript 的 回溯算法(Backtracking Algorithm) 来快速求出所有满足目标金额的发票组合。

以下是一段无依赖、即拿即用的原生 JS 发票自动凑数算法代码:

/**
 * 纯前端发票组合凑数算法(回溯剪枝)
 * @param {number[]} invoices 发票金额数组
 * @param {number} target 目标报销金额
 * @param {number} tolerance 允许误差(默认 0 元)
 * @returns {number[][]} 符合条件的发票组合方案
 */
function findInvoiceCombinations(invoices, target, tolerance = 0) {
    let results = [];
    // 1. 降序排序,优化剪枝效率
    invoices.sort((a, b) => b - a);

    function backtrack(startIndex, currentPath, currentSum) {
        // 2. 如果当前组合金额在允许误差范围内,记录该方案
        if (Math.abs(currentSum - target) <= tolerance && currentSum > 0) {
            results.push([...currentPath]);
        }
        
        // 3. 剪枝:超过目标金额直接返回
        if (currentSum > target + tolerance) return;

        for (let i = startIndex; i < invoices.length; i++) {
            currentPath.push(invoices[i]);
            // 递归寻找下一张发票
            backtrack(i + 1, currentPath, currentSum + invoices[i]);
            currentPath.pop(); // 回溯撤销
        }
    }

    backtrack(0, [], 0);
    return results;
}

// ==========================================
// 测试示例:手里有 6 张发票,凑 350 元报销额
// ==========================================
const myInvoices = [120, 85, 230, 45, 300, 150];
const targetAmount = 350;

console.log("--- 找到的报销发票组合方案 ---");
console.log(findInvoiceCombinations(myInvoices, targetAmount));
// 输出结果: [ [ 230, 120 ], [ 150, 120, 80... ] ]

💡 极简免登录在线工具

如果你在平时办公报销时不想每次都复制代码调试,我也将这段凑数算法和 120 多种常用的开发、财务、跨境工具打包成了一个完全免登录、无广告、且 100% 纯前端运行(数据绝不上传服务器) 的在线小工具箱:

👉 解忧工具箱 (https://www.cqqzx.com/)

【解忧工具箱】已精选收录 121+ 款硬核工具:

  • 💴 打工人与财务解忧:发票凑数小助手、人民币大写转换、社保退休金测算、劳动仲裁(N+1/2N)赔偿计算。
  • 💻 开发者与 AI 解忧:llms.txt 生成器、AI 品牌可见度模拟器、JSON 转 TS/Go/Dart/Py/C#、Crontab 表达式在线生成。
  • 📦 跨境卖家解忧:体积重计算器、FBA 利润核算、条形码/UPC 生成、PayPal 手续费计算。

所有工具均支持断网本地运行,主打一个安全隐私与极致效率,大家可以按 Ctrl + D 收藏备用!


Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐