2012-12-02 35 views
0

可以说我有这些配料的配方,配料和成本清单。SQL中的优化算法

任何人都可以指出我在正确的方向,我如何开始与一些美元数额的预算找到我可以做的食谱数量最多?

例如

如果我有$ 50花和5配方:

  1. 洋葱汤=>成分(水$ 1,洋葱$ 45)
  2. 沙拉=>成分(生菜$ 4)
  3. 蛋糕=>成分(面粉$ 8)
  4. 果冻=>成分(果冻$ 4)
  5. scambled鸡蛋=>成分(卵$ 3)

如何获得SQL返回像一个列表:

Combination number | recipes 
----------------------------- 
1      1 
1      2 
2      1 
2      4 
3      1 
3      5 
+0

只是一个快速评论:不要尝试在纯SQL中做到这一点。如果您正在使用MS SQL,请尝试使用一些SQL CLR代码。如果您正在使用Oracle,请使用Java。更好的是,我会在数据库之上构建一个应用程序来处理算法。此外,这看起来像一个贪婪会有用的问题,所以请尝试了解该技术。 –

+0

你想要的食谱或最大数量,你可以做? –

回答

1

你没有指定一个DBMS,所以我假定PostgreSQL的:

with recursive all_combinations as (
    select array[name] as combination, 
     total_cost + 0.0 as combination_cost, 
     id 
    from recipe 
    union all 
    select a.combination || r.name, 
     a.combination_cost + r.total_cost, 
     r.id 
    from recipe r 
    join all_combinations a 
     on a.combination_cost + r.total_cost <= 50 
    and not a.combination @> array[r.name] 
    and r.id > a.id 
) 
select combination, combination_cost 
from all_combinations 
order by array_dims(combination), 1; 

我不是100%肯定它涵盖所有的组合,虽然

这里是一个SQLFiddle的例子:http://sqlfiddle.com/#!12/351be/4