从最少的商店购买购物清单的所有商品

时间:2014-05-01 18:55:45

标签: algorithm

我有一份我要购买的n件商品清单。 (每个项目都不同)

list = {item1, item2, item3 .... itemn}

我知道这些商店有k商店和商品清单。

shop1 = {item3, item5, item6 ...}
shop2 = {item1, item5, item8 ...}
...
shopk = {item1, item6, item8 ...}

我保证列表中的每个项目都可以在至少一家k商店购买。 一旦您访问商店,您可以购买一件或多件您选择的商品。

问题我想尽量减少购买我名单上所有商品所需的商店数量。

我的解决方案1 ​​我使用了Brute force DFS和memoization。这提供了最佳解决方案,但具有昂贵的复杂性(O(n!))并且对我的要求不可行。 (k和n有时可达到300)

我的解决方案2 我使用了一个贪婪的解决方案,我访问了我的列表中提供最多项目数的商店。购买商品,并从列表中删除所有这些商品。我重复这个,除非我的购物清单不是空的。 (不购买所有必需品)

尽管解决方案2运行速度非常快但不幸的是,此解决方案并非最佳。

使用Solution3 在谷歌上搜索时,我发现了一个使用二分图和流程解决的类似问题。 (我仍然试图进行类比,并检查这种方法对我的问题的适用性)

这是一个已知问题吗?如果不是,是否可以修改解决方案2以获得最佳解决方案?

如果您能通过建议使用任何语言或任何方法或关键字(算法名称)等的代码片段来帮助我解决此问题,我将感激不尽。

1 个答案:

答案 0 :(得分:1)

  

这是一个已知问题吗?

是的,这是Set Cover Problem(具体来说,它是未加权的品种)。众所周知,它是NP完全的,因此您目前仅限于近似或太慢而不实用的解决方案。