有效地从2个数据表中选择与一列的总和匹配的行

本文关键字:一列 数据表 2个 选择 有效地 | 更新日期: 2023-09-27 18:24:06

我有两个数据表:

  1. 应付账款:包含一组我必须支付的发票。(发票金额)
  2. 应收账款:包含一组我必须收到的发票。(发票金额)

我必须创建一个过程,其中我必须从两个表中选择最大行,以便它们的总和相等。

示例:

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)的组合,以便两者匹配。

我要实现的想法是:

  1. 从两个表中查找金额相同的发票&选择它们
  2. 从任一表中查找金额最大的项目。请尝试从其他表中选择行(一行或多行)来匹配此数量

但我知道这种逻辑在某个时候会失败,无法匹配最大发票。我记不起这种行动的技术名称了
寻找作为算法或伪代码或方法的启动器。

有效地从2个数据表中选择与一列的总和匹配的行

查看背包问题。

我要做的是生成你能从应付账款中获得的所有金额,然后生成你能通过应收账款获得的所有款项,然后查看它们重叠的地方,并获得最大的价值。

类似这样的东西:

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的非空集合。

如果你想进行背包变异,你可以通过动态编程来实现背包问题的一个非常有效的解决方案,分别针对每个表,然后查询结果矩阵中具有相同应付款和应收款价值的背包大小。