使用 php5.2 和 MySQL 4.1.22
我遇到过一些事情,起初看起来很简单,但后来就一个简单、干净的解决方案避开了我。
我们有预定义的产品“包”。包装 1 中可能包含产品 A、B 和 C。包2可能有A、C、D和G等。包的大小从3到5个产品不等。
现在,客户可以选择任何 10 种可用产品并制作“定制”包装。由于我们已经有某些预定义的包,我们希望尽可能使用更小的现有包(为了便于运输)来构建自定义包。
因此,例如,客户选择创建产品 A、B、C、D、E 和 F 的“自定义包”。我们已经有一个包含 A、B 和 C 的预定义包,称为 Foo。因此,顺序将是 Foo、D、E 和 F。
问题在于拥有最少数量的单个物品,其次是最少数量的包裹。例如:
定制包装:A、B、C、D、E、F、G、H、I、J。
预定义包 (1):A、B、C、D、E
预定义包 (2):A、B、C
预定义包 (3):D、E、F
如果我只是选择最大的匹配项,那么我有 1 个(5 件)包裹和 5 个单独的物品。包 (2) 和 (3) 都不能用剩余的项目构建。
如果我更深入地研究,我发现通过不构建包 (1),我可以构建包 (2) 和包 (3)。这意味着我有 2 个包裹和 4 个单独的物品(在这个商业规则中是一个更好的选择)。
当我使用 MySQL 时,我受限于只有一层子选择可用(据我所知)。所以这种排序需要在 php.ini 中执行。我已经研究过使用 array_intersect() 来确定匹配项,但是随着预定义包的数量线性增长,我发现的每种方式在处理方面都呈指数增长。
我和其他几个程序员朋友一起运行了这个,虽然看起来应该有一个简单的答案,但我们都发现它并不像看起来那么简单。所以,我想我会把它贴在这里作为一个很好的面条担架。非常感谢您抽出宝贵时间!