我有table1:
CREATE TABLE table1 (
itemID INTEGER PRIMARY KEY,
cost INTEGER NOT NULL,
income INTEGER NOT NULL
);
我有MYMONEY
金额。
我希望SQL为我提供最好的物品组合,我可以买卖,以便获得最大的收入(我在离开商店后卖掉物品)
换句话说:
从table1
获取子集,其中此子集中cost
的总和小于或等于MYMONEY
且income
的总和最高。
例如,如果我们有一个包含元组(1, 5, 10)
,(2, 3, 6)
,(3, 2, 5)
和MYMONEY=5
子集的表,其中满足第一个条件的是{(1, 5, 10)}
和{(2, 3, 6), (3, 2, 5)}
。第二个条件是第二个子集更好,因为此子集中income
的总和为11,其中income
的第一个子集总和为10.
关键是,这些子集可能具有各种功率。如果我对子集的功率有限制,我可以通过加入或交叉产生足够的时间并选择最佳行来轻松实现。
我可以使用一个计数器c
,它说“现在让我们只看到那些功率等于c
的子集”并使用带有交叉产品的解决方案,但我觉得它很慢而且很难看。
如果有很多“最佳”子集,它可能只提供其中任何一个或所有子集,这并不重要。
如果重要,我正在使用PostgreSQL和Java。
答案 0 :(得分:3)
您应该使用the Knapsack algorithm。在sql中很难解决它,所以我建议你在客户端获取所有需要的数据然后计算。
答案 1 :(得分:2)
可以使用SQL完成:
with recursive calc as (
select itemid as itemid, array[itemid] as id_list, cost, income
from table1
where cost <= 5
union all
select c.itemid, p.id_list||c.itemid, c.cost + p.cost, c.income + p.income
from table1 as c
join calc as p on p.itemid < c.itemid
where c.cost + p.cost <= 5
)
select *
from calc
order by income desc;
但只是因为可以完成,并不一定意味着这样做是个好主意。
对于任何真实世界的表格,此查询都会有 可怕的 效果。
这是一个SQLFiddle:http://sqlfiddle.com/#!15/10455/1