有效地从2个数据表中选择与一列的总和匹配的行
本文关键字:一列 数据表 2个 选择 有效地 | 更新日期: 2023-09-27 18:24:06
我有两个数据表:
- 应付账款:包含一组我必须支付的发票。(发票金额)
- 应收账款:包含一组我必须收到的发票。(发票金额)
我必须创建一个过程,其中我必须从两个表中选择最大行,以便它们的总和相等。
示例:
Payables Receivables
-------- -----------
INV1 120 ABC1 100
INV2 50 ABC2 30
INV3 80 ABC3 20
INV4 30 ABC4 70
我可以创建(INV1 + INV2 + INV4 = 200) & (ABC1 + ABC2 + ABC4 = 200)
的组合,以便两者匹配。
我要实现的想法是:
- 从两个表中查找金额相同的发票&选择它们
- 从任一表中查找金额最大的项目。请尝试从其他表中选择行(一行或多行)来匹配此数量
但我知道这种逻辑在某个时候会失败,无法匹配最大发票。我记不起这种行动的技术名称了
寻找作为算法或伪代码或方法的启动器。
查看背包问题。
我要做的是生成你能从应付账款中获得的所有金额,然后生成你能通过应收账款获得的所有款项,然后查看它们重叠的地方,并获得最大的价值。
类似这样的东西:
def knapsack(items) {
sums = {0: null}
for item in items:
for sum, last_item in sum:
// Skip if you've already used item or the you can get the sum some other way.
if last_item == item or sum + item.value in sums: continue
else:
sums[sum+item.value] = item
return sums
payable_sums = knapsack(payables)
receivable_sums = knapsack(receivables)
for sum, item in payable_sums:
if sum in receivable_sums:
print "Success, you can get ", sum, " on both sides."
如果您需要获得实际项目,只需使用映射中的值来识别最后一个项目,减去该项目的值,然后重复计算剩余的和,直到达到0。
算法总是会给你一个结果(两边至少为0)。
这个问题看起来与子集和问题非常相似。
应付款可以表示为负值,应收款可以表示为正值,然后您需要找到一个合计为0的非空集合。
如果你想进行背包变异,你可以通过动态编程来实现背包问题的一个非常有效的解决方案,分别针对每个表,然后查询结果矩阵中具有相同应付款和应收款价值的背包大小。