如果行的总和等于X,则选择行

时间:2014-07-22 22:42:14

标签: mysql sql

我有一张桌子可以容纳物品和他们的重量"它看起来像这样:

items
-----

id          weight
----------  ----------
1           1
2           5
3           2
4           9
5           8
6           4
7           1
8           2

我想要获得的是一个总和(权重)正好是X的组,同时遵守插入的顺序。

例如,如果我在寻找X = 3,那么应该返回:

id          weight
----------  ----------
1           1
3           2

尽管ids 7和8的总和也是3。

或者,如果我正在寻找X = 7应该返回

id          weight
----------  ----------
2           5
3           2

尽管ids 1,3和6的总和也是7。

我有点迷失在这个问题中并且没有能够提出至少做类似事情的查询,但是考虑到这个问题,RDBMS可能变得非常复杂处理。这可以通过查询来完成吗?如果没有,我可以查询数据库以获得最少量数据的最佳方式是什么?

编辑:正如第十二所说的那样,我需要返回总和,无论它返回多少行,所以如果我要求X = 20,我应该得到:

id          weight
----------  ----------
1           1
3           2
4           9
5           8

1 个答案:

答案 0 :(得分:1)

这可能在sql中变得非常困难。你要做的是解决knapsack problem,这是非平凡的。

  

从计算机科学的角度来看,背包问题很有意思,原因很多:

  • 背包问题的决策问题形式(可以在不超过权重W的情况下实现至少V的值)是NP完全的,因此没有可能的算法正确和快速(多项式时间)情况,除非P = NP。
  • 虽然决策问题是NP完全的,但优化问题是NP难的,其分辨率至少与决策问题一样困难,并且没有已知的多项式算法可以告诉,给定解决方案,是否是最优(这意味着没有更大的解决方案,从而解决NP-complete的决策问题)。
  • 存在使用动态编程的伪多项式时间算法。
  • 有一个完全多项式时间近似方案,它使用伪多项式时间算法作为子程序,如下所述。
  • 在实践中出现的许多案例,以及某些案例中的“随机实例”,仍可以完全解决。
相关问题