【前端算法】纯 JS 实现发票自动凑数算法:告别财务报销凑数难题(附在线解忧工具)
·
在日常公司财务报销或电商财务对账中,我们经常遇到这样一个头疼的场景:手里有一堆不同面额的发票(例如: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 收藏备用!
更多推荐




所有评论(0)